2016-11-16 95 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,参见编辑答案 –