View Full Version : مشکل در join
محسن بابائی
پنج شنبه 23 آذر 1385, 21:44 عصر
سلام بر دوستان عزیز
من سه تا جدول به شرح زیر دارم
Service : اطلاعات مربوط به سرویس (کد سرویس(ServiceID ) کد مشتری(CustomerID) و آدرس (Address)
Customer : اطلاعات مشتری (کد مشتری ، نام مشتری)
NoCustomer( کد سرویس ، نام مشتری)
جدول NoCustomer برای مشتریانی می باشد که کد اشتراک نداشته که اطلاعات آنها همراه با کد سرویس را در خود نگه می دارد.
حالا می خوام این سه جدول را طوری با هم join کنم که نام مشتری را از جدول Customer به وسیله کد مشتری و در جاهایی که فیلد CustomerID مقدارش Null هست نام مشتری را در جدول NoCustomer بوسیله فیلد ServiceID پیدا کنم و نشان بدم.
نمای View هم به این شکل باشد
ServiceID name Address
---- ---- ----
---- ---- ----
بانک اطلاعات را هم دانلود کنید و از آن استفتده کنید.
از دوستانی که جواب بدن پیشاپیش تشکر می کنم.
AminSobati
جمعه 24 آذر 1385, 21:47 عصر
دوست عزیزم،
شما میتونین دریک Subquery، دو جدول Customer و NoCustomer رو با هم Union کنین و نتیجه اش رو با Service بصورت Join بکار بگیرید (به شرط اینکه رکوردهای دو جدول مشتری دارای IDهای تکراری نباشند). یا اینکه واقعا دو جدول مشتری رو با هم ادغام کنید و با یک Bit صفر و یک، مشتری های Register شده رو از Register نشده مجزا کنید. در این حالت هم Join با Service مشکلی نخواهد داشت
محسن بابائی
شنبه 25 آذر 1385, 13:00 عصر
آقای ثباتی سلام
من فکر کنم سوالم را خوب متوجه نشدید. وقتی باید از جدول NoCustomer استفاده کرد که در جدول Service کد اشتراک(CustomerID ) مساوی Null باشد . پس نمی توان از روشی که شما گفتید استفاده کرد . من خودم باOuterJoin به نتیجه رسیده ام ولی مشکی که هست اینه که من می خوام در خروجی فقط یک ستون Name داشته باشم در حالی که یه ستون name از جدول Customer و یک سطون name از جدول NoCustomer هست.
اینم Outer Join ی که ایجاد کرده ام.
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[VIEW2]') and OBJECTPROPERTY(id, N'IsView') = 1)
drop view [dbo].[VIEW2]
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE VIEW dbo.VIEW2
AS
SELECT dbo.Service.ServiceID, dbo.Service.CustomerID, dbo.NOCustomer.name, dbo.Customer.name AS Expr1, dbo.Service.aaa
FROM dbo.Service FULL OUTER JOIN
dbo.Customer ON dbo.Service.CustomerID = dbo.Customer.CustomerID FULL OUTER JOIN
dbo.NOCustomer ON dbo.Service.ServiceID = dbo.NOCustomer.ServiceID
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
AminSobati
شنبه 25 آذر 1385, 13:38 عصر
چه در حالتی که Union انجام بدین بین دو جدول مشتری، و چه در حالتیکه بصورت فیزیکی این دو جدول رو یکی کنید، در هر حال تنها یک ستون Name خواهید داشت. در چنین ساختاری، کد مشتری در جدول Service نمیتونه Null بشه چون حتما یک مشتری براش وجود داره
محسن بابائی
شنبه 25 آذر 1385, 23:24 عصر
سلام
خب مشکل هم همینجاست که مشتریانی هستند که جزء مشتریانی نیستند که کد اشتراک داشته باشند پس مقدار Null در کد اشتراک برایشان در نظر می گیرم و اطلاعاتشان مثل نام آنها را در جدول NoCustomer ذخیره می کنم و با استفاده از کد سرویس به اطلاعاتشان می خوام دسترسی داشته باشم البته با توجه به توضیحاتی که قبلا دادم . حالا شما اگر روشی برای هل این مسئله دارین لطف کنید ... .
AminSobati
شنبه 25 آذر 1385, 23:40 عصر
وقتی یک فیلد Identity برای مشتریان وجود داشته باشه، اگر مشتری Register شده باشه، مقدار فیلد Identity حکم شماره اشتراک رو داره، و برای مشتری Register نشده، فقط حکم یک فیلد ارتباط دهنده با جدول Service. اگر دو جدول مشتری حتما باید جدا باشند، شما میتونین Union کنین، ولی Query که از Customers میزنید رو با یک فیلد ثابت مثلا 1 همراه کنید و Query که از NoCustomers میزنید رو با عدد ثابت 0. اما هر کسی که در NoCustomers ثبت میشه باید کدش در Service وجود داشته باشه تا طراحی بتونه به Query جواب بده
faridgmi
یک شنبه 26 آذر 1385, 01:39 صبح
سلام
فکر کنم این Query بتونه کمکت کنه
SELECT s.ServiceID , s.CustomerID , CustomerName =
CASE
WHEN s.CustomerID IS NULL THEN nc.name
ELSE c.name
END , s.aaa
From Service s
left join Customer c
on (c.CustomerID = s.CustomerID)
left join NOCustomer nc
on (nc.ServiceID = s.ServiceID)
محسن بابائی
یک شنبه 26 آذر 1385, 10:26 صبح
آقا فرید بسیار بسیار متشکرم . خود خودشه.
آقای ثباتی از شما هم تشکر می کنم.
مرسی .
محسن بابائی
یک شنبه 26 آذر 1385, 19:44 عصر
آقا فرید فقط تنها عیبی که داره توی رکورد های بالا سرعتش پایینه .
اگر روش دیگه سراغ داری هم بگو.
دوستان دیگر هم کمک کنن.
faridgmi
یک شنبه 26 آذر 1385, 22:44 عصر
این Query رو هم تست کن
Select * from
(
Select s.ServiceID , s.CustomerID , c.name , s.aaa
From Service s
Left join Customer c on (c.CustomerID = s.CustomerID)
union all
(
select nc.ServiceID , s.CustomerID , nc.name , s.aaa from NOCustomer nc
left join Service s on (nc.ServiceID = s.ServiceID)
)
) as l
where l.name is not null
order by l.ServiceID
محسن بابائی
سه شنبه 28 آذر 1385, 09:04 صبح
آقا فرید دستت درد نکنه . من شرمنده ام این سوال را می پرسم . حالا به فرض اینکه برای یک موجودیت دیگر (مثلا اجناس) وضعیتی مثل Customer داشته باشیم دستورات به چه شکل می باشد.
ممنون
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.