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

比较两个表,如果行不同,请在Oracle中运行查询,oracle,plsql,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

想想我的两个表有相同的列。一列是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是很容易做到这一点,还是应该创建一个独立的应用程序来实现这一逻辑

就用吧

在您的例子中,如果您真的想使用PL/SQL,那么选择countinto a local variable。写一个逻辑,如果计数>0,然后做其他事情。

只需使用

在您的例子中,如果您真的想使用PL/SQL,那么选择countinto a local variable。写一个逻辑,如果计数>0,然后做其他事情

这种情况是否意味着两个表中都可能缺少行?如果只有一个,则:

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;
这种情况是否意味着两个表中都可能缺少行?如果只有一个,则:

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;

由于您的表具有相同的列,通过使用,您可以轻松检查两个对应的行是否相同—如果向表中添加了列,则无需更新代码

此外,使用允许您查找一个表中的行,而不查找另一个表中的行

因此,您可以使用类似的方法来实现您的目标:

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

由于您的表具有相同的列,通过使用,您可以轻松检查两个对应的行是否相同—如果向表中添加了列,则无需更新代码

此外,使用允许您查找一个表中的行,而不查找另一个表中的行

因此,您可以使用类似的方法来实现您的目标:

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

“merge”语句是您所需要的

以下是语法:

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) 

谷歌合并语法,了解更多关于该语句的信息

你需要的是“合并”语句

以下是语法:

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) 

谷歌合并语法,了解更多关于该语句的信息

您尝试过语句吗?您尝试过语句吗?匹配时是否可以合并语句:UPDATE和INSERT?您的问题是什么?我尝试在匹配时将UPDATE和INSERT语句全部滑入,因为基本上我正在更新当前行以显示其已“删除”,然后插入具有值的新行使用更新匹配后插入,不匹配后插入。如果有任何问题,请在此处注释您的查询匹配后可以使用合并语句:UPDATE and INSERT?您的问题是什么?我尝试在匹配时将UPDATE和INSERT语句全部滑入,因为基本上我正在更新当前行以显示其已“删除”,然后插入新的行具有值的行在匹配时使用“更新后”选项,在不匹配时使用“插入后”选项。如果有问题,请在此处注释您的查询以获得答案,但EQ是否可以比较表中的多个列?例如,如果我想比较ID、文本、数字列?@lzc'不确定是否理解您的注释,但通过自然联接,您将比较两个表中具有相同名称的所有列。通过一些测试,如果ID不同,U.ID=V.ID进行比较;如果ID不同,EQ返回null;如果相同,则返回1。请给出答案,但EQ是否可以比较表中的多个列?例如,如果我想比较ID、文本、数字列?@lzc'不确定是否理解您的注释,但通过自然联接,您将比较两个表中具有相同名称的所有列。通过一些测试,如果ID不同,U.ID=V.ID进行比较;如果ID不同,EQ返回null;如果ID相同,则返回1