我正在使用 2 個表:1 個處理一組人的基本人口統計資料,1 個處理已完成的活動。我需要做的是從人口統計表中提取所有結果(所有人),然后顯示在給定時間范圍內完成某種型別活動的任何人的活動資訊(給定的人也可能完成了多項活動在那個時間范圍內)。如果一個人沒有完成任何指定的活動,我仍然希望他們在串列中可見。我希望結果如下所示:
PersonID Name DateOfBirth ActivityDate ActivityType
---------------------------------------------------------------------
1001 John Smith 01/01/1990 10/18/2022 Painting
1002 Jane Doe 12/31/1980 NULL NULL
1003 Bob Brown 07/04/1995 10/17/2022 Reading
1003 Bob Brown 07/04/1995 09/09/2022 Painting
1004 Mike Jones 03/24/1984 NULL NULL
1005 Ann Green 11/30/1988 08/29/2022 Writing
1006 Sally Black 05/15/1999 NULL NULL
看起來這應該是LEFT JOIN兩個表之間的非常簡單的查詢:
SELECT DISTINCT
d.PersonID,
d.Name
d.DateOfBirth,
a.ActivityDate
a.ActivityType
FROM Demographics d
LEFT JOIN Activity a ON d.PersonID = a.PersonID
WHERE ActivityDate BETWEEN DATEADD(yy,-1,GETDATE()) AND GETDATE()
AND ActivityType IN ('Painting','Reading','Writing')
ORDER BY d.PersonID, a.ActivityDate DESC
但是,當我運行此查詢時,我只獲得實際完成活動的人的NULL結果(即在我的示例中沒有結果的人)。
PersonID Name DateOfBirth ActivityDate ActivityType
---------------------------------------------------------------------
1001 John Smith 01/01/1990 10/18/2022 Painting
1003 Bob Brown 07/04/1995 10/17/2022 Reading
1003 Bob Brown 07/04/1995 09/09/2022 Painting
1005 Ann Green 11/30/1988 08/29/2022 Writing
同樣,我想顯示人口統計表中的所有人員,然后顯示已完成活動的人的指定活動。
我的加入有問題嗎?這是LEFT JOIN正確的方法嗎?
uj5u.com熱心網友回復:
您的WHERE子句完全基于您的左連接 ( Activity) 表,并且您不允許在子句NULL中的任何地方使用值。WHERE所以連接正在作業,但您正在過濾任何沒有活動的行。
要糾正此問題,請更改
WHERE ActivityDate BETWEEN DATEADD(yy,-1,GETDATE()) AND GETDATE()
AND ActivityType IN ('Painting','Reading','Writing')
至
WHERE a.PersonId IS NULL
OR (
ActivityDate BETWEEN DATEADD(yy,-1,GETDATE()) AND GETDATE()
AND ActivityType IN ('Painting','Reading','Writing')
)
uj5u.com熱心網友回復:
添加條件時
ActivityType IN ('Painting','Reading','Writing'),
您實際上禁止ActivityType將NULL未完成任何活動的人包括在內。相同的條件ActivityDate
如下更改您的查詢以允許NULL值
SELECT DISTINCT
d.PersonID,
d.Name
d.DateOfBirth,
a.ActivityDate
a.ActivityType
FROM Demographics d LEFT JOIN Activity a ON d.PersonID = a.PersonID
WHERE (ActivityDate IS NULL OR ActivityDate BETWEEN DATEADD(yy,-1,GETDATE()) AND GETDATE())
AND (ActivityType IS NULL OR ActivityType IN ('Painting','Reading','Writing'))
ORDER BY d.PersonID, a.ActivityDate DESC
uj5u.com熱心網友回復:
我認為一個關鍵字可以這樣做
參考MDSN
LEFT [ OUTER ] 指定左表中不滿足連接條件的所有行都包含在結果集中,并且除了內連接回傳的所有行之外,其他表的輸出列都設定為 NULL。
SELECT DISTINCT
d.PersonID,
d.Name
d.DateOfBirth,
a.ActivityDate
a.ActivityType
FROM Demographics d
LEFT OUTER JOIN Activity a ON d.PersonID = a.PersonID
WHERE ActivityDate BETWEEN DATEADD(yy,-1,GETDATE()) AND GETDATE()
AND ActivityType IN ('Painting','Reading','Writing')
ORDER BY d.PersonID, a.ActivityDate DESC
uj5u.com熱心網友回復:
在現有查詢中使用“或”作為“空”記錄的 ActivityType 列,如下所示:
選擇不同的
d.PersonID,
d.Name
d.DateOfBirth,
a.ActivityDate
a.ActivityType
來自人口統計 d
左加入活動 a ON d.PersonID = a.PersonID
WHERE ActivityDate BETWEEN DATEADD(yy,-1,GETDATE()) 和 GETDATE()
AND ( ActivityType IN ('Painting','Reading','Writing') OR ActivityType is Null )
ORDER BY d.PersonID, a.ActivityDate DESC
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/517915.html
