PDA

View Full Version : نمایش کل اطلاعات جدول A در کوئری بین دو جدول Join شده حتی اگه اطلاعاتی از جدول A در جدول B نباشه



ozzy_mra
یک شنبه 13 بهمن 1392, 16:34 عصر
سلام
من دو تا جدول دارم به شکل زیر :

[Management].[Person](
[PersonsID] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [nvarchar](50) NOT NULL,
[LastName] [nvarchar](100) NOT NULL,
[Semat] [nvarchar](50) NOT NULL,
[Vahed] [nvarchar](50) NOT NULL,
[Floor] [int] NOT NULL,
[ShowInList] [bit] NOT NULL,
[LastState] [nchar](10) NOT NULL)
و
[Management].[PersonEnters](
[PersonEnters] [int] IDENTITY(1,1) NOT NULL,
[PersonID] [int] NOT NULL,
[Vaziat] [nchar](10) NOT NULL,
[Time] [nchar](10) NOT NULL,
[PDate] [nchar](10) NOT NULL)
که در اولی اطلاعات کل افرادم تو سیستم هست و تو جدول دوم اطلاعات ورود و خروج اونا ثبت میشه
من می خوام تو گزارشم مثلاً تو تاریخ 1392/11/14 اطلاعات کلیه ورود و خروج هام رو نشون بدم و اگر کارمندی به طور مثال اون روز غایب بوده که طبیعتا در جدول دوم اطلاعاتش ثبت نشده هم تو گزارشم نشون داده بشه و به جای اطلاعات از جدول دوم با Null یا یه استرینگ ثابت مثل "ثبت نشده" پر بشه
من این کوئری رو استفاده کردم :
select * from [Management].[Person] left outer join [Management].[PersonEnters]
on [Management].[Person].[PersonsID] = [Management].[PersonEnters].[PersonID]
where [Management].[PersonEnters].PDate = '1392/11/14'
که فقط اطلاعات کسایی که تو اون روز در جدول دوم ثبت شدند رو نشون میده و کسایی که اون روز براشون ورود یا خروج ثبت نشده رو نشون نمیده.
اگه ممکنه راهنماییم کنید.
در واقع برای هر روز یه تایم شیت برای تمام کارکنا می خوام ، اونایی که بودند ورود و خروجشون نمایش داده بشه و اونایی که ورودشون تو اون روز خاص ثبت نشده با Null یا یه رشته ثابت نمایش داده بشه.
ممنون

hamid_hr
یک شنبه 13 بهمن 1392, 16:53 عصر
این شرطو به کوئریت اضافه کن
or isnull([Management].[PersonEnters].PDate,'') = ''

ولی میشه همه ی افراد دیگه

ozzy_mra
دوشنبه 14 بهمن 1392, 07:45 صبح
این شرطو به کوئریت اضافه کن
or isnull([Management].[PersonEnters].PDate,'') = ''

ولی میشه همه ی افراد دیگه

این اگر برای یه فردی که تو روز الف بوده و در روز ب نبوده و شما کوئری رو در روز ب اجرا کنید درست جواب نمیده و به مرور زمان با پر شدن اطلاعات برای تمام افراد جواب درستی نمیده
ممنون

ozzy_mra
دوشنبه 14 بهمن 1392, 08:04 صبح
با تشکر از دوستان ، این سوالو تو StackOverflow هم مطرح کردم و جوابشو به این صورت بهم دادند . برای اینکه این تاپیک برای کسی که این سوالو داشته باشه جواب اونو می زارم :
از لحاظ منطقی عبارت Where بعد از Join اعمال می شود. اگر برخی از اطلاعات Person در جدول PersonEnters موجود نباشد مقدار Null را در PDate به عنوان مجموعه جواب بر می گردانند اما در جواب ما این فیلد ها نمایش داده نمیشند چون طبیعتاً Null <> '1392/11/12'
پس در نتیجه قبل از Join باید Where را اعمال کنیم ؛ دو حالت برای این کوئری به شرح زیر می باشد :
SELECT *
FROM Management.Person AS p
LEFT JOIN (
SELECT *
FROM Management.PersonEnters
WHERE PDate = '1392/11/14'
) AS pe
ON p.Person.ID = pe.PersonID
;
یا این کوئری :
SELECT *
FROM Management.Person AS p
LEFT JOIN Management.PersonEnters AS pe
ON p.Person.ID = pe.PersonID AND pe.PDate = '1392/11/14'
;