Sql-Server

子查詢中 WHERE 中使用的 SQL 主查詢值

  • March 9, 2022

我對這裡的 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;

引用自:https://dba.stackexchange.com/questions/308497