PDA

View Full Version : بدست آوردن مجموع تعداد رکوردهای چند جدول توسط یک دستور SQL



Morteza_s
یک شنبه 24 آذر 1387, 19:22 عصر
سلام

آیا این کار امکان پذیر هست که با یک دستور SQL بشه مجموع تعداد رکوردهای چند جدول رو بدست آورد؟

مثلآ من از این دستور استفاده کردم:


SELECT Count (*) AS Cn FROM Table1,Table2,Table3,Table4

اما یه عدد خیلی بزرگ خروجی داد که درست نبود.

linux
دوشنبه 25 آذر 1387, 00:35 صبح
سلام

آیا این کار امکان پذیر هست که با یک دستور SQL بشه مجموع تعداد رکوردهای چند جدول رو بدست آورد؟

مثلآ من از این دستور استفاده کردم:


SELECT Count (*) AS Cn FROM Table1,Table2,Table3,Table4

اما یه عدد خیلی بزرگ خروجی داد که درست نبود.
اگر شما یه ورقی بزنید کتابهایی که تئوری rdbsm ها درس می دهند خواهید دید که
این کد یعنی که این چندتا تیبل را ضرب دکتارتی کند و بعد بشمارد.
یعنی اگر جدول اول 10 تا رکورد داشته باشه و جدول دوم 10 تا جواب 100 خواهد بود.

rostamkhani
چهارشنبه 27 آذر 1387, 07:34 صبح
سلام
شما خوب میتونید از همین دستور استفاده کنید و با شرط .
شرط دستور Sql رو با کلید اصلی ها بدین ( البته در صورتی که حداقل یک مقدار از مقادیر کلید در جداول رو میدونید ) . اونوقط تعداد رکوردها میشه تعداد رکوردهای مجموع جداول.
اگر N تا جدول داشته باشید و دستور Select رو بنویسید با شرط بین کلیدهای اصلی با And برای N-1 جدول
تعداد رکوردها میشود تعداد جدول N-1کم .
مثلا برای 3جدول :


Select count(*) from Tbl1,Tbl2,Tbl3 where (Tbl1.pri=1 And Tbl2.pri=1)

در این حالت Count برابر با تعداد رکوردهای جدول سوم یعنی Tbl3 میباشد.
حال برای تعداد رکوردهای جدول اول Tbl1 شرط : (Tbl2.pri=1 And Tbl3.pri=1)
و برای تعداد رکوردهای جدول دوم Tbl2 شرط : (Tbl1.pri=1 And Tbl3.pri=1)
را به ادامه شرط or میکنیم . تنها یک نکته مانده تا تعداد Count دقیق درست بشه اینکه بین این شرطها که or میشه یک رکورد مشترک میشه که دوباره شمرده نمیشه در نتیجه تعداد شرطها که برابر است با تعداد جداول > به اعضای هر دو شرط or یک رکورد تکراری داریم > Count باید بعلاوه N-1 بشه
دستور کامل برای پیدا کردن مجموع رکوردهای 3جدول در نهایت به شکل زیر در میاد:


Select count(*)+2 from Tbl1,Tbl2,Tbl3
where (Tbl1.pri=1 And Tbl2.pri=1)
or (Tbl2.pri=1 And Tbl3.pri=1)
or (Tbl1.pri=1 And Tbl3.pri=1)