Sql-Server
子查詢中 WHERE 中使用的 SQL 主查詢值
我對這裡的 SQL 感到非常困惑,我有這個範例,我在子查詢中使用主查詢中的值,然後使用 XML PATH 在日期之間添加逗號。設置是 2 個表,其中一個帶有我想串在一起的日期。我不確定為什麼子查詢 where 語句沒有重新調整正確的結果。
http://www.sqlfiddle.com/#!5/5443b/2
設置
CREATE TABLE log ([logID] [int] NULL, [LogDate] [datetime] NULL ) ; CREATE TABLE logdata ([logdataID] [int] NULL, [logID] [datetime] NULL ) ; INSERT INTO log ([logID], [LogDate]) VALUES (1, 2021-02-01), (1, 2021-02-02), (1, 2021-02-03), (3, 2021-03-12), (4, 2021-02-12) ; INSERT INTO logdata ([logdataID], [logID]) VALUES (1, 1), (2, 2), (3, 3) ;
我的嘗試:
Select logID, logdataID LogDate = (SELECT ',' + CAST(LogDate AS varchar) FROM log WHERE logID = logID FOR XML PATH('') ) from logdata
結果
1,2021-02-01,2021-02-02,2021-02-03,2021-03-12,2021-02-12 2,2021-02-01,2021-02-02,2021-02-03,2021-03-12,2021-02-12 3,2021-02-01,2021-02-02,2021-02-03,2021-03-12,2021-02-12
但我想要的結果是:
1 2021-02-01,2021-02-02,2021-02-03 2 2021-03-12 3 2021-02-12
在您的子查詢中,
WHERE logID = logID
是模棱兩可的。LogID 存在於兩個表中,但查詢不會告訴 SQL Server 您打算使用logID
一個表連接到另一個表logID
。在您的查詢版本中,SQL Server 僅在子查詢的範圍內解釋它,因此它使用
log.logID = log.logID
的本質上是WHERE 1=1
.相反,請始終使用表別名並在列前加上表別名。像這樣的東西:
SELECT ld.logID, ld.logdataID, LogDate = (SELECT ',' + CAST(l.LogDate AS varchar) FROM log AS l WHERE l.logID = ld.logID FOR XML PATH('') ) FROM #logdata AS ld;