gpt4 book ai didi

sql - 如何根据另一个表的聚合查询更新一个表

转载 作者:行者123 更新时间:2023-12-02 06:18:29 24 4
gpt4 key购买 nike

假设我有两张 table 。

表A

  • ID
  • A_status
  • parent_id_B

表B

  • ID
  • B_状态

因此,B 中的每个 id 可以在 A 中拥有多条记录。

现在我的问题是,当表A中具有相同parent_id_B的所有子条目的A_status = 1时,我需要将B_status设置为1,否则设置B_status = 2

例如:

Table A:
id A_status parent_id_B
1 1 1
2 1 1
3 1 2
4 1 3
5 1 3

Table B:
id B_status
1 0
2 0
3 0

Expected result:
Table B:
id B_status
1 1
2 1
3 1

现在考虑另一种情况

Table A:
id A_status parent_id_B
1 1 1
2 1 1
3 2 2
4 2 3
5 1 3

Table B:
id B_status
1 0
2 0
3 0

Expected result:
Table B:
id B_status
1 1
2 2
3 2

我需要这个只能在 sqlite 上工作。谢谢

最佳答案

我相信这可以这样做:

UPDATE TableB
SET B_Status =
(SELECT MAX(A_Status) FROM TableA WHERE TableA.Parent_ID_B = TableB.ID);

SqlFiddle with your second case here

在更一般的情况下(不依赖于 A 状态的直接映射,您还可以在映射中使用 CASE ... WHEN:

UPDATE TableB
SET B_Status =
CASE WHEN (SELECT MAX(A_Status)
FROM TableA
WHERE TableA.Parent_ID_B = TableB.ID) = 1
THEN 1
ELSE 2
END;

编辑(在状态数量多于原始状态的情况下):

我相信您需要确定每行的 2 个事实,例如

  • 表 A 中是否存在每个 B 的状态不是 1 的行
  • 同一个 B 至少必须有一行
  • 或者,A 处于状态 1 的行数是否 = A 中 B 的所有行数。

这是第一个选项:

UPDATE TableB
SET B_Status =
CASE WHEN
EXISTS
(SELECT 1
FROM TableA
WHERE TableA.Parent_ID_B = TableB.ID
AND TableA.A_Status <> 1)
OR NOT EXISTS(SELECT 1
FROM TableA
WHERE TableA.Parent_ID_B = TableB.ID)
THEN 2
ELSE 1
END;

Updated Fiddle

关于sql - 如何根据另一个表的聚合查询更新一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22423433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com