حذف نتایج تکراری (بدون در نظر گرفتن ترتیب) از یک کوئری SQL

بیش از هر چیز باید بگویم که این نوشته مربوط به برنامه‌نویسی در فریم‌ورک اسپرینگ و هایبرنیت همراه با دیتابیس اوراکل است؛ اگر با این فریم‌ورک آشنایی ندارید، خواندن این نوشته‌ی من در مورد این چهارچوب برنامه‌نویسی می‌تواند برای شما مفید باشد. پایگاه داده‌ی اوراکل (oracle) جزء قوی‌ترین پایگاه‌داده‌ها یا DBMS در دنیای نرم‌افزار به شمار می‌رود. از جمله ویژگی‌های آن می‌توان به سرعت بالا در دسترسی به داده‌ها، ضریب امنیتی بالا، کنترل همزمانی، توانایی نگهداری حجم انبوه اطلاعات و … اشاره نمود. در این نوشته من می‌خواهم از یک کوئری SQL نتایج تکراری را حذف کنم.

فرض کنید یک کوئری زیر را داریم که result آن به صورت زیر است

select s.id as id1, d.id as id2
from table1 s, table1 d
where some_where_clause  
 _______
|id1|id2|
|---|---|
| 1 | 2 |
| 2 | 1 |
| 1 | 3 |
| 3 | 1 |
| 8 | 7 |
| 7 | 8 |
| 6 | 3 |

حال نتیجه‌ای که مورد نظر ماست این است که وقتی یک زوج id1, id2 در خروجی وجود داشته باشد، دیگر نتیجه معکوس آن نباید در خروجی نباشد، به عبارت دیگر هر زوج id تنها یکبار در خروجی بیاید (بدون در نظر گرفتن ترتیب). برای مثال، اگر در خروجی id1 و id2 اعداد 1,2 باشند، دیگر 2,1 در خروجی نباید وجود داشته باشد، از این منظر ردیف‌های مشخص شده با رنگ زرد در result تکراری هستند.

 _______
|id1|id2|
|---|---|
| 1 | 2 |
| 2 | 1 |*تکراری
| 1 | 3 |
| 3 | 1 |*تکراری
| 8 | 7 |
| 7 | 8 |*تکراری
| 6 | 3 |

برای این منظور می‌توان از کوئری زیر استفاده کرد.

select t1.id1, t1.id2
from            (selects.id as id1, d.id as id2
                  from table1 s, table1 d
                  where some_where_clause      ) t1
left outer join  (select s.id as id1, d.id as id2
                  from table1 s, table1 d
                  where some_where_clause      ) t2 on t1.id1 = t2.id2
                                                   and t1.id2 = t2.id1         
where t2.id1 is null
or t1.id1 < t2.id1 

 _______
|id1|id2|
|---|---|
| 1 | 2 |
| 1 | 3 |
| 8 | 7 |
| 6 | 3 |

برچسب‌ها:،،،،،
مرتضی اسدی
مرتضی اسدی
سلام! من مرتضی اسدی هستم، یک توسعه‌دهنده‌ی نرم‌افزار و در این وبلاگ دست‌نوشته‌هایم را می‌نویسم.

نظرات


ایرج تیموری

سلام
مرتضی جوون
بست آو د بست جیگر.

مرتضی اسدی

سلام و درود بر آقا ایرج گل و گلاب
خیلی چاکریم. 💐💐💐