Tsql SQL Server:选择查询正在工作,但不选择正在更新的查询。子查询问题

Tsql SQL Server:选择查询正在工作,但不选择正在更新的查询。子查询问题,tsql,subquery,Tsql,Subquery,我对更新查询有问题 下面是我试图用来更新另一个名为BOARD_CALLS的表的摘录 表:董事会任务 我使用两条规则: 当至少有一个IS_PHONE/IS_EMAIL/IS_DUPLICATE=1时,则目标表上的IS_PHONE/IS_EMAIL/IS_DUPLICATE=1 其他0 当IS_DUPLICATE_WITH不为空时,我需要用呼叫号码填充IS_DUPLICATE_ 当我选择机载任务时,一切正常,结果符合我的要求 结果如下: SELECT REF_CALL, MAX(IS_DUPLIC

我对更新查询有问题

下面是我试图用来更新另一个名为BOARD_CALLS的表的摘录

表:董事会任务

我使用两条规则:

当至少有一个IS_PHONE/IS_EMAIL/IS_DUPLICATE=1时,则目标表上的IS_PHONE/IS_EMAIL/IS_DUPLICATE=1 其他0

当IS_DUPLICATE_WITH不为空时,我需要用呼叫号码填充IS_DUPLICATE_

当我选择机载任务时,一切正常,结果符合我的要求

结果如下:

SELECT REF_CALL,

MAX(IS_DUPLICATE_WITH) IS_DUPLICATE_WITH,
CASE WHEN COUNT(CASE WHEN IS_PHONE = '1' THEN 1 END) > 0 THEN 1 ELSE 0 END AS IS_PHONE,
CASE WHEN COUNT(CASE WHEN IS_EMAIL = '1' THEN 1 END) > 0 THEN 1 ELSE 0 END AS IS_EMAIL,
CASE WHEN COUNT(CASE WHEN IS_DUPLICATE = '1' THEN 1 END) > 0 THEN 1 ELSE 0 END AS IS_DUPLICATE

FROM BOARD_TASKS
WHERE IS_DUPLICATE_WITH IS NOT NULL 
OR IS_DUPLICATE = 1
OR IS_DUPLICATE = 0
OR IS_DUPLICATE IS NULL
GROUP BY REF_CALL
表:董事会电话

这里是我使用的select查询:

SELECT REF_CALL,

MAX(IS_DUPLICATE_WITH) IS_DUPLICATE_WITH,
CASE WHEN COUNT(CASE WHEN IS_PHONE = '1' THEN 1 END) > 0 THEN 1 ELSE 0 END AS IS_PHONE,
CASE WHEN COUNT(CASE WHEN IS_EMAIL = '1' THEN 1 END) > 0 THEN 1 ELSE 0 END AS IS_EMAIL,
CASE WHEN COUNT(CASE WHEN IS_DUPLICATE = '1' THEN 1 END) > 0 THEN 1 ELSE 0 END AS IS_DUPLICATE

FROM BOARD_TASKS
WHERE IS_DUPLICATE_WITH IS NOT NULL 
OR IS_DUPLICATE = 1
OR IS_DUPLICATE = 0
OR IS_DUPLICATE IS NULL
GROUP BY REF_CALL
但当我尝试更新BOARD_呼叫时,我收到了两条错误消息

子查询返回了多个值。当子查询后跟=、!=、时,不允许这样做=

通过聚合或其他集合操作消除空值

这里是我的更新查询

UPDATE T1

SET


T1.IS_DUPLICATE_WITH = (SELECT MAX(IS_DUPLICATE_WITH) 
                        FROM BOARD_TASKS WHERE IS_DUPLICATE_WITH IS NOT NULL 
                        OR IS_DUPLICATE = 1 
                        OR IS_DUPLICATE = 0 
                        OR IS_DUPLICATE IS NULL 
                        GROUP BY REF_CALL),

T1.IS_PHONE = (SELECT 
              (CASE WHEN 
               COUNT(CASE WHEN IS_PHONE = '1' THEN 1 END) > 0 
               THEN 1 ELSE 0 END) 
               FROM BOARD_TASKS 
               GROUP BY REF_CALL),

T1.IS_EMAIL = (SELECT 
              (CASE WHEN 
               COUNT(CASE WHEN IS_EMAIL = '1' THEN 1 END) > 0 
               THEN 1 ELSE 0 END) 
               FROM BOARD_TASKS 
               GROUP BY REF_CALL),

T1.IS_DUPLICATE = (SELECT 
                  (CASE WHEN 
                   COUNT(CASE WHEN BOARD_TASKS.IS_DUPLICATE = '1' THEN 1 END) > 0 
                   THEN 1 ELSE 0 END) 
                   FROM BOARD_TASKS 
                   GROUP BY REF_CALL)

FROM BOARD_CALLS T1
INNER JOIN BOARD_TASKS T2 ON T1.REF_CALL = T2.REF_CALL
BOARD_CALLS在每列上都有默认值

REF_CALL:创建新呼叫时自动填充(主键)

是否为电话/是否为电子邮件/是否为副本:0

是重复的吗?带有:NULL


我真的不知道为什么它使用select而不是update(更新)

错误消息非常具体,您试图用一个明显返回多行的查询来更新列。您在文章开头的select语句中显示了这一点。 例如,UPDATE语句的这一部分:

正在尝试将该查询的所有值强制为一个值。这就是优化器试图告诉您的

此外,我不确定的所有可能的值都是重复的,但您似乎列出了所有这些值。如果是这样,那么WHERE子句中不需要它们中的任何一个

试试这个,我没有任何DDL,所以可能会有语法错误,但它应该可以帮助您实现:

UPDATE BOARDCALLS 
    SET IS_DUPLICATE_WITH = t2.IS_DUPLICATE_WITH,
        IS_PHONE = t2.IS_PHONE,
        IS_EMAIL = t2.IS_EMAIL,
        IS_DUPLICATE = t2.IS_DUPLICATE
FROM BOARDCALLS t1
INNER JOIN (
            SELECT REF_CALL,
            MAX(IS_DUPLICATE_WITH) IS_DUPLICATE_WITH,
            CASE WHEN COUNT(CASE WHEN IS_PHONE = '1' THEN 1 END) > 0 THEN 1 ELSE 0 END AS IS_PHONE,
            CASE WHEN COUNT(CASE WHEN IS_EMAIL = '1' THEN 1 END) > 0 THEN 1 ELSE 0 END AS IS_EMAIL,
            CASE WHEN COUNT(CASE WHEN IS_DUPLICATE = '1' THEN 1 END) > 0 THEN 1 ELSE 0 END AS IS_DUPLICATE

            FROM BOARD_TASKS
            WHERE IS_DUPLICATE_WITH IS NOT NULL 
            OR IS_DUPLICATE = 1
            OR IS_DUPLICATE = 0
            OR IS_DUPLICATE IS NULL
            GROUP BY REF_CALL) t2 ON t1.REF_CALL = t2.REF_CALL

旁白:将
int
值与字符串进行比较,例如当IS_PHONE='1'时,将
值与字符串进行比较是一个坏习惯。您好。是的,我不知道我为什么那样做。我已经改正了。谢谢你,工作得很好。子查询的问题已更正。我应该考虑做一个“内部联接”:(。另一条消息“null值被聚合或其他集合操作消除”已更正为。这是因为某些NUM_任务只包含NULL值,而不是1和0。并且is_DUPLICATE的值大于0、1或NULL,因为与此数据库相关的软件上存在错误,正在数据库上写入垃圾数据。无论如何,非常感谢您的帮助。
T1.IS_DUPLICATE_WITH = (SELECT MAX(IS_DUPLICATE_WITH) 
                        FROM BOARD_TASKS WHERE IS_DUPLICATE_WITH IS NOT NULL 
                        OR IS_DUPLICATE = 1 
                        OR IS_DUPLICATE = 0 
                        OR IS_DUPLICATE IS NULL 
                        GROUP BY REF_CALL)
UPDATE BOARDCALLS 
    SET IS_DUPLICATE_WITH = t2.IS_DUPLICATE_WITH,
        IS_PHONE = t2.IS_PHONE,
        IS_EMAIL = t2.IS_EMAIL,
        IS_DUPLICATE = t2.IS_DUPLICATE
FROM BOARDCALLS t1
INNER JOIN (
            SELECT REF_CALL,
            MAX(IS_DUPLICATE_WITH) IS_DUPLICATE_WITH,
            CASE WHEN COUNT(CASE WHEN IS_PHONE = '1' THEN 1 END) > 0 THEN 1 ELSE 0 END AS IS_PHONE,
            CASE WHEN COUNT(CASE WHEN IS_EMAIL = '1' THEN 1 END) > 0 THEN 1 ELSE 0 END AS IS_EMAIL,
            CASE WHEN COUNT(CASE WHEN IS_DUPLICATE = '1' THEN 1 END) > 0 THEN 1 ELSE 0 END AS IS_DUPLICATE

            FROM BOARD_TASKS
            WHERE IS_DUPLICATE_WITH IS NOT NULL 
            OR IS_DUPLICATE = 1
            OR IS_DUPLICATE = 0
            OR IS_DUPLICATE IS NULL
            GROUP BY REF_CALL) t2 ON t1.REF_CALL = t2.REF_CALL