如何使用特定的业务逻辑从多行更新单行?

问题描述 投票:0回答:1

我有2个表,即tableA,tableB,其中tableA的主键作为外键存在于tableB中。业务逻辑是连接两个表并从tableB中获取记录。现在,如果有超过 1 条记录,则不会应用任何逻辑。但是,如果只有 1 条记录,并且 tableB 的特定列的值为“1”,那么只需要更新 tableA。

如何根据上述条件编写更新查询?请帮忙。

我有2个表,即表A和表B,其中表A的主键作为外键存在于表B中。

表A:

id col1 col2 col3
1 t1 1 政策1
2 t3 2 政策2
3 t4 3 政策1

表B:

id col1 col2
1 1 1
2 1 2
3 2 1
select * from tableB a join tableA b on a.id=b.col1 where a.col3='Policy1'

如果上面的查询给出了tableB中的2条记录,那么就没有update语句。但是,如果查询如下:

select * from tableB a join tableA b on a.id=b.col1 where a.col3='Policy2'

然后它只会给出 tableB 中的 1 条记录,其中“col2”的值为“1”。在这种情况下,我必须更新 tableA 并将 tableA 的 col2 值仅针对该单行设置为“0”。因此,每当我从 tableB 中仅获取 1 行,并且“col2”的值为 1 时,此时我只需要更新 tableA。

我尝试使用 PLSQL,但由于我是 PLSQL 新手,所以我无法做到这一点。

declare
v number;
p varchar;
begin
select * into v from tableB a join tableA b on a.id=b.col1 where a.col3= p
if v=1 then
update tableA
end;

如何根据上述条件编写更新查询?请帮忙。

sql plsql
1个回答
0
投票

您可以连接表、计算行数并使用 MERGE INTO 进行查询:

--      S a m p l e    D a t a :
Create Table tableA AS
Select 1 as ID, 't1' as COL1, 1 as COL2, 'Policy1' as COL3 From Dual Union All
Select 2,   't3',   2,  'Policy2' From Dual Union All
Select 3,   't4',   3,  'Policy1' From Dual;

Create Table tableB AS
Select 1 as ID, 1 as COL1, 1 as COL2 From Dual Union All
Select 2,   1,  2 From Dual Union All
Select 3,   2,  1 From Dual;
Select * From tableA;

...更新前的表A

身份证 COL1 COL2 COL3
1 t1 1 政策1
2 t3 2 政策2
3 t4 3 政策1
--      multiple rows - no update  
MERGE INTO tableA t
USING
    ( Select a.ID as A_ID, b.ID as B_ID, Count(a.ID) Over(Partition By a.ID) as CNT
      From       tableA a
      Inner Join tableB b ON(b.COL1 = a.ID)
      Where a.COL3 = 'Policy1'
   ) x ON(x.A_ID = t.ID And x.CNT = 1)
WHEN MATCHED THEN UPDATE
     SET t.COL3 = 'Updated';

...检查表A

Select * From tableA;

...尝试更新多行后的表 A - 没有更新的行

身份证 COL1 COL2 COL3
1 t1 1 政策1
2 t3 2 政策2
3 t4 3 政策1

-- 单行 - 进行更新

MERGE INTO tableA t
USING
    ( Select a.ID as A_ID, b.ID as B_ID, Count(a.ID) Over(Partition By a.ID) as CNT
      From       tableA a
      Inner Join tableB b ON(b.COL1 = a.ID)
      Where a.COL3 = 'Policy2'
   ) x ON(x.A_ID = t.ID And x.CNT = 1)
WHEN MATCHED THEN UPDATE
     SET t.COL3 = 'Updated';

...检查表A

Select * From tableA;

...尝试更新单行后表 A - 更新了 1 行

身份证 COL1 COL2 COL3
1 t1 1 政策1
2 t3 2 更新了
3 t4 3 政策1

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.