حذف نتایج تکراری (بدون در نظر گرفتن ترتیب) از یک کوئری 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 |
برچسبها:آموزش اوراکل،آموزش نرمافزار اوراکل،مرتضی اسدی،Morteza Asadi،برنامهنویسی،
نظرات
مرتضی اسدی
سلام و درود بر آقا ایرج گل و گلاب
خیلی چاکریم. 💐💐💐
ایرج تیموری
سلام
مرتضی جوون
بست آو د بست جیگر.