PDA

View Full Version : نوشتن کوئری دریافت اطلاعات از جداول



damanpak
جمعه 15 اسفند 1393, 16:15 عصر
سلام به دوستان برنامه نویس
مستقیم میرم سراغ سوال!!!
در تصویر زیر جدول Citys جدول شهر ها و کلید اصلی ID میباشد
جدول CityOfOrdes دارای کلید خارجی جدول Citys و جدول Order میباشد
در جدول Order اطلاعاتی نظیر تاریخ ساعت کد فاکتور و شماره فاکتور ثبت میشود
129186

و در جدول CityOfOrders به ازای هر رکورد در جدول Order نیز
یه رکورد واسه مبدا و یه رکورد واسه مقصد ثبت میشه
مثلا در جدول Order داریم
129187

و در جدول CityOfOrder داریم
129188

که رکورد اول مربوط به مبدا فاکتور مورد نظر و رکورد دوم مربوط به مقصد فاکتور مورد نظر میباشد(کد اصلی سفارش = 223)
حال چه کوئری باید بنویسم که تاریخ،ساعت،شماره فاکتور،مبدا،مقصد هرکدام از رکوردهای موجود در جدول Order را در یک رکورد ببینیم؟

SabaSabouhi
جمعه 15 اسفند 1393, 18:57 عصر
سلام
با توجه به شرحی که دادی طراحی‌ات اشکال داره.
شما تو جدول Order دو تا ستون برای شهر مبدا و شهر مقصد اضافه کن.

صبا صبوحی

golbafan
جمعه 15 اسفند 1393, 19:19 عصر
سلام
در CityOfOrdes باید یک ستون boolean مثلا به نام FromOrTo اضافه کنید به عنوان اینکه آیا مبدا است یا مقصد

بعد این ویو رو باید ایجاد کنی:


create VIEW [dbo].[view1] AS
SELECT
dbo.[order].id,
dbo.[order].orderdate,
.
.
.
dbo.citys.cityname,
.
.
dbo.[CityOfOrder ].fromorto
FROM
dbo.[CityOfOrder ] ,
dbo.citys ,
dbo.[order]
WHERE
dbo.[CityOfOrder ].orderid = dbo.[order].id AND
dbo.[CityOfOrder ].cityid = dbo.citys.id


بعدش میتونی روی این ویو کوئری select رو بزنی

مثلا:

select * from view1 where orderdate=x and fromorto=0;


در ضمن بهتره اسم جدول order رو تغییر بدی چون از توابع خود sql است

damanpak
جمعه 15 اسفند 1393, 20:09 عصر
سلام و تشکر از دوستان بابت توجهشون
SabaSabouhi (http://barnamenevis.org/member.php?17257-SabaSabouhi) عزیز اتفاقا پیشنهاد شما طراحی نادرست دیتابیس رو میرسونه(تا جایی که من سرچ کردم)چون وجود دوتا فیلد که به یه کلید اصلی در جدول دیگه وصل میشن کار درستی نیست مخصوصا توی قضیه فعال کردن خصوصیت Update Cascade و Delete Cascade واسه این دوتا فیلد که خود Sql هم اجازه نمیده
golbafan (http://barnamenevis.org/member.php?101169-golbafan) عزیز همیشه اولین رکورد در جدول CityOfOrders مربوط به مبدا و دومین رکورد همیشه مقصد هست آیا با این وجود بازم به فیلد سوم FromOrTo نیاز هست؟
ضمنا این کدی که شما گفتی جواب نیست
من میخوام به این صورت جواب بگیرم که که مبدا و مقصد یه فاکتور توی یه فیلد و جلوی تاریخ و ساعت مربوط به هرفاکتور قرار بگیرند مثل زیر

129196
در این تصویر رکورد اول کد شهر مشهد و رکورد دوم مد شهر تهران بوده که با هم جوین شدند و توی یه فیلد نمایش داده شدن

damanpak
جمعه 15 اسفند 1393, 23:12 عصر
سلام مجدد
بنده در Vb این عبارت رو نوشتم

DataGridView1.DataSource = (From F In CurrentDB.OrderEmissions Select F.ID, F.OrderDate,
F.OrderClock, FPath = F.CityOfOrders.FirstOrDefault().City.CityName & " _ " &
F.CityOfOrders.OrderByDescending(Function(G) G.ID).FirstOrDefault().City.CityName).ToList()

و سیستم دقیقا همون پاسخی رو که میخواستم داد بهم و وقتی باید نرم افزار EFProf خروجی رو چک کردم دیدم این ک.ئری رو به اس کیو ال میفرسته

SELECT [Extent1].[ID] AS [ID],
[Extent1].[OrderDate] AS [OrderDate],
[Extent1].[OrderClock] AS [OrderClock],
[Extent3].[CityName] + N' _ ' + [Extent5].[CityName] AS [C1]
FROM [dbo].[Order] AS [Extent1]
OUTER APPLY (SELECT TOP (1) [Extent2].[CityId] AS [CityId]
FROM [dbo].[CityOfOrders] AS [Extent2]
WHERE [Extent1].[ID] = [Extent2].[OrderId]) AS [Limit1]
LEFT OUTER JOIN [dbo].[Citys] AS [Extent3]
ON [Limit1].[CityId] = [Extent3].[ID]
OUTER APPLY (SELECT TOP (1) [Project1].[CityId] AS [CityId]
FROM (SELECT [Extent4].[ID] AS [ID],
[Extent4].[CityId] AS [CityId]
FROM [dbo].[CityOfOrders] AS [Extent4]
WHERE [Extent1].[ID] = [Extent4].[OrderId]) AS [Project1]
ORDER BY [Project1].[ID] DESC) AS [Limit2]
LEFT OUTER JOIN [dbo].[Citys] AS [Extent5]
ON [Limit2].[CityId] = [Extent5].[ID]

این کوئری رو توی Sql تست کردم و درست جواب داد اما یکم بیش از حد طولانیه
کسی راه حل بهتری سراغ نداره؟

SabaSabouhi
جمعه 15 اسفند 1393, 23:46 عصر
سلام و تشکر از دوستان بابت توجهشون
SabaSabouhi (http://barnamenevis.org/member.php?17257-SabaSabouhi) عزیز اتفاقا پیشنهاد شما طراحی نادرست دیتابیس رو میرسونه(تا جایی که من سرچ کردم)چون وجود دوتا فیلد که به یه کلید اصلی در جدول دیگه وصل میشن کار درستی نیست مخصوصا توی قضیه فعال کردن خصوصیت Update Cascade و Delete Cascade واسه این دوتا فیلد که خود Sql هم اجازه نمیده

سلام
دوست عزیز، چرا گمان می‌کنی دو تا ستون نمی‌تونن به یک جدول وصل بشن؟
و اصولاً چرا ممکنه من بخوام این رو Cascade کنم؟ برای Delete Cascade باید دلیل منطقی وجود داشته باشه که تو این حالت وجود نداره.

صبا صبوحی

golbafan
شنبه 16 اسفند 1393, 12:28 عصر
سلام دوست من...
شما هرجور دوست دارید میتونید طراحی کنید و کوئری بزنید
ولی راهی که من و آقای صبوحی گفتیم اصولی تره

در ضمن حتما شما به فیلدی نیاز پیدا خواهید کرد که مشخص کنه مبدا و مقصد رو
چون ممکنه به هر دلیل داده ای در میان داده های شما قرار بگیره و کل ماجرا خراب بشه (یا داده ای پاک بشه)