0 امتیاز
قبل در برنامه نویسی توسط (1.1هزار امتیاز)
ویرایش شده قبل توسط

چگونه می توان با استفاده از یک query لیست رکورد های تکراری یک جدول را بر اساس مقادیر یک یا چند ستون مشخص بدست آورد؟

قبل توسط (7.2هزار امتیاز)
چون باید از از توابع analytic استفاده کنید و این توابع معمولا به صورت DB specific می باشند فکر نکنم یک راه حل کاملا cross پیدا کنید.
قبل توسط (1.1هزار امتیاز)
منم فکر می کردم پیچیدس ولی با تابع count و having حل شد!

2 پاسخ

+1 امتیاز
قبل توسط (1.1هزار امتیاز)
ویرایش شده قبل توسط

اگر فرض کنیم مقادیر دو ستون col1 و col2 مشخص کننده تکراری بودن رکورد هستند، query به شکل زیر می شود:

SELECT
    col1, col2, COUNT(*)
FROM
    your_table
GROUP BY
    col1, col2
HAVING 
    COUNT(*) > 1

اگر ستون های مشخص کننده تکراری بودن رکورد بیشتر هستند، می تونید بجای  col1 و col2 نام تمامی آن ستون ها را بیاورید فقط باید در group by هم نام تمام آنها اضافه شود.

قبل توسط (7.2هزار امتیاز)
شما با استفاده از این راهکار رکوردهای تکراری را پیدا نمی کنید، بلکه مقادیر تکراری را پیدا می کنید.
قبل توسط (1.1هزار امتیاز)
فرق رکورد تکراری با مقدار تکراری چیه ؟
قبل توسط (1.1هزار امتیاز)
شما می تونید بجای  col1 و col2 نام تمام ستون هارو بیارید فقط باید در group by هم نام همشونو بیارید.
قبل توسط (7.2هزار امتیاز)
رکورد قابل ویرایش یا حذف است. یعنی id را هم نمایش می دهد.
شما اگر id را در group by قرار دهید دیگر انگار group by وجود ندارد! اینگونه نیست؟
قبل توسط (1.1هزار امتیاز)
نه، شما می تونید جای COUNT(*) از count (id) استفاده کنید. من از این query خودم استفاده کردم:
select customer_number ,count (customer_number) from tbl_customer group by customer_number having count (customer_number) >1 ;
قبل توسط (7.2هزار امتیاز)
خب شما با این کوئری مقادیر customer_number تکراری را به دست می آورید. نه رکوردهای تکراری را.
باز رسیدیم به بحث مقدار و رکورد!
و باز هم این حرف را تکرار می کنم که با قرار دادن یک فیلد unique درون group by در اصل آن را بی اثر می کنید.
قبل توسط (1.1هزار امتیاز)
اگر رکوردهای تکراری رو می خاین تمام ستون هارو درون select و group by بیاورید و count(*) بزنید.
قبل توسط (7.2هزار امتیاز)
می شه یه کوئری برای رکوردهای تکراری زیر ،در جواب خود ارائه کنید؟

WITH a AS
     (SELECT 1 id, 1 b, 1 c
        FROM DUAL
      UNION ALL
      SELECT 2, 2, 1
        FROM DUAL
      UNION ALL
      SELECT 3, 2, 1
        FROM DUAL
      UNION ALL
      SELECT 4, 3, 1
        FROM DUAL)
SELECT *
  FROM a;
قبل توسط (1.1هزار امتیاز)
قبول دارم اگه pk هم درون group by بیاد دیگه اصلا امکان وجود رکورد تکراری وجود نداره. این برای مواردیه که می خواهیم رکوردهای تکراری بر مبنای یک یا چند ستون خاص را پیدا کنیم که شما بهش می گید مقادیر تکراری.
قبل توسط (1.1هزار امتیاز)
صورت سوال ویرایش شد.
قبل توسط (1.1هزار امتیاز)
در ضمن این مورد معمولا در مواردی پیش میاد که شما برروی یک یا چند ستون unique تعریف نکردین چون اگه تعریف کرده بودین که رکورد تکراری اضافه نمی شد.
+1 امتیاز
قبل توسط (7.2هزار امتیاز)

برای پیدا کردن مقادیر تکراری می توانید از group by استفاده نمایید. اما برای یافتن رکوردهایی که دارای مقادیر تکراری هستند می توانید با استفاده از یک left join با مقادیر تکراری آنها را پیدا کنید.

 

WITH a AS
     (SELECT 1 ID, 1 b, 1 c
        FROM DUAL
      UNION ALL
      SELECT 2, 2, 1
        FROM DUAL
      UNION ALL
      SELECT 3, 2, 1
        FROM DUAL
      UNION ALL
      SELECT 4, 3, 1
        FROM DUAL
      UNION ALL
      SELECT 5, 3, 1
        FROM DUAL
      UNION ALL
      SELECT 6, 3, 1
        FROM DUAL)
SELECT a.*
  FROM a
       LEFT JOIN
       (SELECT   MIN (ID) AS ID, b, c
            FROM a
        GROUP BY b, c) aa ON a.ID = aa.ID
 WHERE aa.ID IS NULL;


        ID          B          C
---------- ---------- ----------
         6          3          1
         5          3          1
         3          2          1


3 rows selected.

شما در بالا تمام رکوردهای تکراری را دارید و در زیر مقادیر تکراری را:

WITH a AS
     (SELECT 1 ID, 1 b, 1 c
        FROM DUAL
      UNION ALL
      SELECT 2, 2, 1
        FROM DUAL
      UNION ALL
      SELECT 3, 2, 1
        FROM DUAL
      UNION ALL
      SELECT 4, 3, 1
        FROM DUAL
      UNION ALL
      SELECT 5, 3, 1
        FROM DUAL
      UNION ALL
      SELECT 6, 3, 1
        FROM DUAL)
SELECT   b, c
    FROM a
GROUP BY b, c
  HAVING COUNT (*) > 1;


         B          C
---------- ----------
         2          1
         3          1


2 rows selected.

 

سوالات مشابه

0 امتیاز
0 پاسخ 1.3هزار بازدید
0 امتیاز
3 پاسخ 2.1هزار بازدید
+2 امتیاز
1 پاسخ 3.2هزار بازدید
سوال شده 11 سال قبل در برنامه نویسی توسط kashi (7.2هزار امتیاز)
0 امتیاز
2 پاسخ 1.6هزار بازدید
...