比较两个表,如果行不同,请在Oracle中运行查询

时间:2014-10-27 16:33:27

标签: oracle plsql

想想我的两个表有相同的列。一列是ID,另一列是文本。是否可以在PLSQL中实现以下伪代码?

Compare each row (They will have the same ID)
    If anything is different about them
        Run a couple of queries: an Update, and an Insert
    ElseIf they are the same
        Do nothing
    Else the row does not exist
        So add the row to the table compared on

使用PLSQL执行此操作是否容易,或者我应该创建一个独立的应用程序来执行此逻辑。

4 个答案:

答案 0 :(得分:3)

由于您的表格具有相同的列,因此使用NATURAL JOIN可以轻松检查两个相应的行是否相同 - 如果您的表中添加了列,则无需更新代码。

此外,使用OUTER JOIN可以查找一个表中的行,但不能查找另一个表中的行。

所以,你可以使用类似的东西来实现你的目的:

for rec in (
    SELECT T.ID ID1,
           U.ID ID2,
           V.EQ
           FROM T 
           FULL OUTER JOIN U ON T.ID = U.ID
           FULL OUTER JOIN (SELECT ID, 1 EQ FROM T NATURAL JOIN U) V ON U.ID = V.ID)
loop
    if rec.id1 is null
    then
        -- row in U but not in T
    elsif rec.id2 is null
    then
        -- row in T but not in U
    elsif rec.eq is null
        -- row present in both tables
        -- but content mismatch
    end if
end loop

答案 1 :(得分:1)

Else the row does not exist
    So add the row to the table compared on

这个条件是否意味着两个表中都可以丢失行?如果只有一个,那么:

insert into t1 (id, text)
select id, text
from t2
minus
select id, text
from t1;

如果错过的记录可以在两个表中,则需要从t1插入表t2行的相同查询。

If anything is different about them

如果您需要对任意数量的不同行执行一次操作,请使用以下内容:

select count(*)
into a
from t1, t2
where t1.id = t2.id and t1.text <> t2.text;
if a > 0 then
   ...

否则:

for i in (
    select *
    from t1, t2
    where t1.id = t2.id and t1.text <> t2.text) loop

  <do something>

end loop;

答案 2 :(得分:1)

A&#39;合并&#39;陈述是你需要的。

以下是语法:

MERGE INTO TARGET_TABLE
USING SOURCE_TABLE
ON (CONDITION)
WHEN MATCHED THEN
UPDATE SET (DO YOUR UPDATES)
WHEN NOT MATCHED THEN
(INSERT YOUR NEW ROWS) 

Google MERGE语法,了解有关该语句的更多信息。

答案 3 :(得分:0)

只需使用MINUS

query_1
MINUS
query_2

在您的情况下,如果您确实想使用PL/SQL,那么select count into a local variable。写一个逻辑,if count > 0 then do other stuff