PDA

View Full Version : کنترل خروجی کوئری بر اساس تعداد رکورد



rmb_ali
چهارشنبه 05 تیر 1387, 15:50 عصر
آیا میشه بر اساس مقدار یه فیلد فقط تعداد خاصی از رکوردها رو نمایش داد
مثلا فیلد id رو داریم میخوایم فقط 5 تای اول از هر id نمایش داده بشه به فرض اینکه مقادیر id=5 به تعداد 10 بار تکرار شده id=6به تعداد 3 بار تکرار شده و id=7 به تعداد 8 بار تکرار شده حالا خروجی ما طوری باشه که از هز ای دی فقط 4 تای اول اونو نمایش بده

رضا عربلو
چهارشنبه 05 تیر 1387, 17:51 عصر
شدنش که میشه. دستورات زیر فل البداحه به ذهنم رسید البته در مورد پرفرمنسش شاید راه حل بهتری نیز باشد. اگر پرایمری کی جدولت PK باشد


SELECT * FROM Table1 t1
WHERE t1.PK IN (SELECT TOP 4 FROM Table1 t2 WHERE t2.ID=t1.ID)

AminSobati
جمعه 07 تیر 1387, 22:07 عصر
من این صورت مسئله رو برای دیتابیس Northwind شبیه سازی میکنم: فرض کنیم در جدول Orders، قصد داریم برای هر مشتری (CustomerID) سه سفارش رو بدست بیاریم. برای SQL Server 2000 از روشی که آقای عربلو پیشنهاد دادند میشه استفاده کرد:



select * from orders o1
where orderid in (select top 3 orderid from orders o2 where o1.customerid=o2.customerid)
order by customerid


برای SQL Server 2005 از این روش استفاده کنید:



select tmp.* from (select distinct customerid from orders ) c
cross apply (select top 3 * from orders o where c.customerid=o.customerid) tmp
order by customerid


بررسی Exec Plan نشون میده روش 2005 تقریبا با نصف IO این کار رو به پایان میبره