PDA

View Full Version : در مورد SQL و Query لطفاٌ کمک کنید.



Abbasgholami
دوشنبه 20 شهریور 1385, 09:01 صبح
من یک N8411.dbf)Query1) و یک kontor.db)Query2) دارم. در هردو یک فیلد به نام "شناسایی=id"، مشترک میباشد. میخواهم idهایی را که در Query1 وجود دارند ولی در Query2 وجود ندارند نمایش داده شود. برای این کار، کد زیر را نوشتم ولی سرعتش واقعاٌ پایین است (تعداد رکوردها در هرکدام 2400 تا میباشد.):


SELECT N.ID_NO,N.NAME,N.ADRES,N.MOTAFR,N.MANDEH_B
from N8411.dbf N
where N.id_no not in (select k.id_no from kontor.db k

mzjahromi
دوشنبه 20 شهریور 1385, 09:42 صبح
روی ID درون Table ایندکس وجود داره؟

Abbasgholami
دوشنبه 20 شهریور 1385, 12:14 عصر
واقعاٌ معذرت میخوام. هر دو Query میباشند. Query1:N8411.dbf , Query2:Kontor.db
البته در بالا هم تصحیحش کردم.

حمیدرضاصادقیان
دوشنبه 20 شهریور 1385, 12:43 عصر
باسلام.
اول چک کنید ببینید index روی فیلدid دارید.دوم میتونید از left outer join هم استفاده کنید.

Abbasgholami
دوشنبه 20 شهریور 1385, 13:03 عصر
در N8411.dbf ایندکسی تعریف نشده است (من این جدول را از خروجی برنامه دیگری میگیرم.) برای Kontor.db نیز فقط فیلد id به عنوان primary key تعریف شده است. بعد میبخشید چه جوری باید از دستوری که گفته بودید استفاده کنم (left outer join)

حمیدرضاصادقیان
دوشنبه 20 شهریور 1385, 13:17 عصر
سلام.به صورت زیر میتوانید استفاده کنید.



SELECT N.ID_NO,N.NAME,N.ADRES,N.MOTAFR,N.MANDEH_B
from N8411.dbf N left outer join kontor.db k
on N.id_no = k.id_no

حال اگر تیکه زیر رو در شرط where قرار بدی اون عددهایی رو که وجود ندارند نشون میده.با این حال همرو داره برای شما بر میگردونه.



where k.id_no is null

ghabil
دوشنبه 20 شهریور 1385, 13:54 عصر
بجای IN میشه از Exists استفاده کرد یعنی اینطوری :


Select * from Table1 T1
where not Exists(Select id from Table2 where id= T1.id)

Exists در تعداد رکوردهای پایین از IN کندتر هست اما در تعداد رکوردهای بالا به مراتب سریعتر میشه . ضمنا استفاده از Outer Join برای این کارها جز در شرایط خاصی ممکن نیست، اما Exists از همان الگوریتمهای Outer Join ها استفاده میکنه .

از همه اینا گذشته تاثیر که ایندکس در بالا رفتن سرعت میزاره با هیچ چیزه دیگه ای قابل مقایسه نیست .