两个表中的数据具有相同数量的comuns(无主键)-table a表示活动记录,表b表示特定公司的非活动记录。状态“A”表示活动,“I”表示非活动
它们都有相同数量的列。如何比较表a和表b中的数据 如果b中存在记录而不是a,则A中的状态列必须设置为“I”否则为“A”
例如: -
表A
COL1 COL 2 COL3 STATUS
1 one this is one A
2 TO THIS IS TO I
Table B
Col1 col2 Col 3 status
3 THREE 33 A
4 for this is for A
现在在表B中col1与1不存在虽然它存在于表A中,状态为A. 因此,在比较表B和表A之后,我们将
update table a
set status ='I'
where col1 =1;
但我不知道如何比较这两张桌子?请帮助?
答案 0 :(得分:1)
我对表a和表b感到困惑,如果a中没有记录,如何将表a中的状态设置为'A'?
在任何情况下,我都会使用MERGE
来更改表中的状态列,具体取决于另一个表中的值:
MERGE INTO table_a
USING table_b
ON (table_a.col1 = table_b.col1 /* add other columns */)
WHEN MATCHED THEN
UPDATE SET status = 'I'
WHERE status <> 'I';
如果在table_a
中找到状态,则会在table_b
中设置状态。您必须指定用于标识/* add other columns */
所在列的相同列的列。请注意NULL
值......
答案 1 :(得分:0)
获取B中而不是A
中的记录 select Col1,
Col2
from B
minus -- <- Oracle/PL SQL specific; other dialects use 'except'
select Col1,
Col2
from A
要更新A,您可以执行以下操作:
update A
set status = case
when (Col1, Col2) in (
select B1.Col1,
B1.Col2
from B B1
minus
select A1.Col1,
A1.Col2
from A A1) then
'I'
else
'A'
end