以下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
答案 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,您还可以考虑将range
与count() over ()
一起使用。看起来你是一个相当新的SQL,所以这将是一个先进的概念。
子查询不能单独运行的原因正如我在上面的评论中提到的那样。内部查询引用外部查询的一列,称为 correlation 。当您将其拉出并尝试单独运行时,将无法再解析该引用。