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

时间:2014-03-15 11:50:25

标签: sql sqlite

说我有两张桌子。

表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上工作。感谢

1 个答案:

答案 0 :(得分:3)

我相信这可以这样做:

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
  • 必须至少有一行
  • 或者,状态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;

Updated Fiddle