为什么SQL Server SELECT语句在SET语句中有效,但自身失败?

时间:2016-11-16 17:18:58

标签: sql sql-server

以下SQL在以下上下文中正常工作:

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.keyfield'无法受约束。 (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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;

update转换为select的一种简单方法。基本上我将set转换为select并将表名移动到from子句中。

如果您有更高版本的SQL Server,您还可以考虑将rangecount() over ()一起使用。看起来你是一个相当新的SQL,所以这将是一个先进的概念。

子查询不能单独运行的原因正如我在上面的评论中提到的那样。内部查询引用外部查询的一列,称为 correlation 。当您将其拉出并尝试单独运行时,将无法再解析该引用。