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