想想我的两个表有相同的列。一列是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执行此操作是否容易,或者我应该创建一个独立的应用程序来执行此逻辑。
答案 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
。