繁体   English   中英

如何基于聚合查询更新一个表从另一张表

[英]How to update one table based on aggregate query form another table

说我有两个桌子。

表A

  • ID
  • A_status
  • parent_id_B

表B

  • ID
  • B_status

因此,对于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与您的第二种情况在这里

在更一般的情况下(不依赖于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至少必须有一行
  • 或者,状态1中A的行数是否等于B中A的所有行数。

这是第一个选择:

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;

更新小提琴

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM