如何从结果中根据多个条件进行更新?WHERE
? "比如说?
UPDATE tb_a, tb_b, tb_c
SET tb_a.A =
CASE
WHEN COUNT(tb_b.is_field_null IS NULL) = 0
THEN "OK"
ELSE "Nope"
END
WHERE tb_a.a = "some" AND tb_a.b = "thing" AND tb_c.c = "else"
AND tb_a.b = tb_b.a
AND tb_c.b = tb_b.c
给出的表格是
tb_a
a | b | A
------------------------------------------
"some" | "thing" | "XXX"
"some" | "thing" | "YYY"
tb_b
a | c | is_field_null
----------------------------------------------
"thing" | "else" | "I have things here"
"thing" | "else" | NULL
"otherThing | "otherElse" | NULL
tb_c
b | c | mapper
----------------------------------------------
"else" | "else" | "ZZZ"
"else" | "else" | "KKK"
我试过了,没有 COUNT
条件,导致整个列 tb_a.A
修改为 "不"。这就像
tb_a
a | b | A
------------------------------------------
"some" | "thing" | "Nope"
"some" | "thing" | "Nope"
但随着 COUNT
,有一个错误的 Invalid use of group function
.我试过了 if
譬如
SET tb_a.A = (if COUNT(tb_b.is_field_null IS NULL) = 0, "Yes", "Nope")
,
条件,但仍然错误。
我希望完全不需要修改,谁能帮帮我?
我发现有一个问题。如果将 tb_b 修改为
a | c | is_field_null
----------------------------------------------
"thing" | "else" | "I have things here"
"thing" | "else" | "I have things here"
"otherThing | "otherElse" | NULL
那么查询后的tb_a仍然是
a | b | A
------------------------------------------
"some" | "thing" | "Nope"
"some" | "thing" | "Nope"
是线 CROSS JOIN (SELECT SUM(is_field_null IS NULL) counter FROM tb_b) t
或 WHEN NOT EXISTS(SELECT 1 FROM tb_b WHERE is_field_null IS NULL)
的返回结果不做检查。WHERE
和 ON
子句?它从原始 tb_b 本身执行检查?
forpas
是工作。在这种情况下,有一些我不太明白的地方。从 forpas
的前两个查询,如果我把它们从 UPDATE
到 SELECT
,他们选择前2行的 tb_b
正确。但在 UPDATE
模式,既不
CROSS JOIN (SELECT SUM(is_field_null IS NULL) counter FROM tb_b) t
或
WHEN NOT EXISTS(SELECT 1 FROM tb_b WHERE is_field_null IS NULL)
的条件下执行。WHERE
和 ON
. 谁能帮我澄清一下?
据我有限的了解,目前这里的问题的紧凑形式是
UPDATE tb_a.A
CROSS JOIN (SELECT SUM(is_field_null IS NULL) counter
FROM tb_a
INNER JOIN tb_b ON tb_a.b = tb_b.a
INNER JOIN tb_c ON tb_c.b = tb_b.c
WHERE tb_a.a = "some" AND tb_a.b = "thing" AND tb_c.c = "else"
) t
SET tb_a.A = CASE
WHEN t.counter = 0 THEN "Yes"
ELSE "Nope"
END
WHERE tb_a.a = "some"
请参考 @forpas 的回答,了解完整的表格解决方案,以及在以下网站上的精彩替代方案。NOT EXISTS
.
使用适当的连接,同时 CROSS JOIN
的查询结果。COUNT(tb_b.is_field_null IS NULL)
像这样。
UPDATE tb_a
INNER JOIN tb_b ON tb_a.b = tb_b.a
INNER JOIN tb_c ON tb_c.b = tb_b.c
CROSS JOIN (SELECT SUM(is_field_null IS NULL) counter FROM tb_b) t
SET tb_a.A = CASE
WHEN t.counter = 0 THEN "OK"
ELSE "Nope"
END
WHERE tb_a.a = "some" AND tb_a.b = "thing" AND tb_c.c = "else"
或与 NOT EXISTS
:
UPDATE tb_a
INNER JOIN tb_b ON tb_a.b = tb_b.a
INNER JOIN tb_c ON tb_c.b = tb_b.c
SET tb_a.A = CASE
WHEN NOT EXISTS(SELECT 1 FROM tb_b WHERE is_field_null IS NULL) THEN "OK"
ELSE "Nope"
END
WHERE tb_a.a = "some" AND tb_a.b = "thing" AND tb_c.c = "else"
编辑:
UPDATE tb_a
INNER JOIN tb_b ON tb_a.b = tb_b.a
INNER JOIN tb_c ON tb_c.b = tb_b.c
CROSS JOIN (
SELECT SUM(is_field_null IS NULL) counter
FROM tb_a
INNER JOIN tb_b ON tb_a.b = tb_b.a
INNER JOIN tb_c ON tb_c.b = tb_b.c
WHERE tb_a.a = "some" AND tb_a.b = "thing" AND tb_c.c = "else"
) t
SET tb_a.A = CASE
WHEN t.counter = 0 THEN "OK"
ELSE "Nope"
END
WHERE tb_a.a = "some" AND tb_a.b = "thing" AND tb_c.c = "else"