2016-11-16 54 views
0

下面的SQL在以下情況下正常工作:爲什麼SQL Server SELECT語句在SET語句內工作,但自行失敗?

USE ThisDB 

UPDATE guest.TABLE2 
SET this_var = (SELECT count(T1.key_field) 
       FROM ThisDB..TABLE1 T1 
       WHERE T1.key_field = guest.TABLE2.keyfield 
        AND T1.date_field between (DATEADD(DAY, -7, guest.TABLE2.other_date)) and guest.TABLE2.other_date) 

然而,對自己,對SELECT聲明(見下文)失敗,錯誤

多部分組成的標識符「guest.TABLE2。關鍵字段'不能被綁定。 (4104)

SELECT 
    count(T1.key_field) 
FROM 
    ThisDB..TABLE1 T1 
WHERE 
    T1.key_field = guest.TABLE2.keyfield 
    AND T1.date_field BETWEEN (DATEADD(DAY, -7, guest.TABLE2.other_date)) 
          AND guest.TABLE2.other_date 
+4

因爲您未在您的select語句中加入guest.Table2。 –

+2

這被稱爲* correlation *。內部查詢與外部查詢相關聯。 – shawnt00

+0

您已選擇一個答案作爲正確答案,但未回答您的原始問題 –

回答

0
SELECT 
    (
    SELECT count(T1.key_field) 
    FROM ThisDB..TABLE1 T1 
    WHERE T1.key_field = guest.TABLE2.keyfield 
     AND T1.date_field between 
      DATEADD(DAY, -7, guest.TABLE2.other_date) and guest.TABLE2.other_date 
    ) as newValue 
FROM guest.TABLE2; 

一個簡單的方法來轉換updateselect。本質上,我將set轉換爲select,並將表名移動到from子句中。

如果您有更高版本的SQL Server,您還可以使用rangecount() over()進行調查。看起來你對SQL相當陌生,所以這將是一個先進的概念。

子查詢不能自行運行的原因正如我在上面的評論中提到的。內部查詢是指外部查詢的一列,其被稱爲相關性。當你拉出並試圖單獨運行時,不再有任何方法來解決該引用。

+0

謝謝! @ shawnt00 – procpy

2

guest.TABLE2.keyfield屬於哪個不在此查詢


存在這與相同的邏輯作爲更新的查詢更新的表。
對於T2的每條記錄,您將獲得基於T1的更新值。

select  guest.TABLE2.* 
      ,(SELECT count(T1.key_field) 
       FROM ThisDB..TABLE1 T1 
       WHERE T1.key_field = guest.TABLE2.keyfield 
        AND T1.date_field between (DATEADD(DAY, -7, guest.TABLE2.other_date)) and guest.TABLE2.other_date) 

from  guest.TABLE2 
+0

好的,謝謝。那麼這是通過將guest.TABLE2添加到FROM語句來解決,還是會產生與原始結果不同的結果? (with UPDATE) – procpy

+0

@ProcComment,參見編輯答案 –