我有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;
如何根据上述条件编写更新查询?请帮忙。
您可以连接表、计算行数并使用 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 |