2015-08-03 18 views
-2

之间的比较这是一个例子,我需要:PL/SQL:过程来处理两个表

表1:

Id champ1 champ2 champ3 
    1  A  S  Q 
    2  D  K  A 
    3  D  A  S 

表2:

Id champ1 champ2 champ3 
    1  A  S  Q 
    2  Q  A  A 
    3  A  A  K 

一个程序,通过表1和表2之间的比较结果馈送表3

表3:

Id_exc name_champ noted_val except_val 
    2 champ1  D   Q 
    3 champ1  D   A 
    2 champ2  K   A 
    3 champ3  S   K 

请,我需要帮助,如果有人有相同的挑战:)先进

+0

什么样的比较? – Hawk

+0

我需要比较表1上的数据和表2上的数据,如果两个表中的数据不相同,则此过程会提供表3。 – user3441432

+0

@ user3441432你对这个问题的描述是相当不错的,如果你将包括你所尝试过的投票可能会在另一个方向去。 – maraca

回答

1

数据建立

感谢:

CREATE TABLE Table1 
    (Id int, champ1 varchar2(1), champ2 varchar2(1), champ3 varchar2(1)) 
; 

INSERT ALL 
    INTO Table1 (Id, champ1, champ2, champ3) 
     VALUES (1, 'A', 'S', 'Q') 
    INTO Table1 (Id, champ1, champ2, champ3) 
     VALUES (2, 'D', 'K', 'A') 
    INTO Table1 (Id, champ1, champ2, champ3) 
     VALUES (3, 'D', 'A', 'S') 
SELECT * FROM dual 
; 

CREATE TABLE Table2 
    (Id int, champ1 varchar2(1), champ2 varchar2(1), champ3 varchar2(1)) 
; 

INSERT ALL 
    INTO Table2 (Id, champ1, champ2, champ3) 
     VALUES (1, 'A', 'S', 'Q') 
    INTO Table2 (Id, champ1, champ2, champ3) 
     VALUES (2, 'Q', 'A', 'A') 
    INTO Table2 (Id, champ1, champ2, champ3) 
     VALUES (3, 'A', 'A', 'K') 
SELECT * FROM dual 
; 

下面的查询会给你的差异

SELECT * 
FROM ((SELECT * 
     FROM table1 
     minus 
     SELECT * 
     FROM table2) 
     UNION 
     (SELECT * 
     FROM table2 
     minus 
     SELECT * 
     FROM table1)); 

ID CHAMP1 CHAMP2 CHAMP3 
2 D K A 
2 Q A A 
3 A A K 
3 D A S 
+0

非常感谢你 – user3441432

+0

该查询给出了差异,但我需要一个查询或过程与PL/SQL饲料表3与两个表之间的差异 – user3441432

1

Fiddle here.

这里是一个查询,得到的结果,但它的丑陋:

SELECT 
    t1.id AS Id_exc, 'champ1' AS name_champ, t1.champ1 AS noted_val, t2.champ1 AS except_val 
FROM 
    Table1 t1 INNER JOIN Table2 t2 ON t2.id = t1.id WHERE t1.champ1 <> t2.champ1 

UNION 

SELECT 
    t1.id AS Id_exc, 'champ2' AS name_champ, t1.champ2 AS noted_val, t2.champ2 AS except_val 
FROM 
    Table1 t1 INNER JOIN Table2 t2 ON t2.id = t1.id WHERE t1.champ2 <> t2.champ2 

UNION 

SELECT 
    t1.id AS Id_exc, 'champ3' AS name_champ, t1.champ3 AS noted_val, t2.champ3 AS except_val 
FROM 
    Table1 t1 INNER JOIN Table2 t2 ON t2.id = t1.id WHERE t1.champ3 <> t2.champ3 
+0

代码不看起来那么丑陋,但绝对服务于此目的。所以+ 1 – SriniV

+0

@realspirituals感谢您加入小提琴,我发现您的比较方式也很有趣,它更加动态。 +1 – maraca

+0

谢谢你的帮助 – user3441432

0

创建或替换程序P_test是

q VARCHAR2(4000字节);

V_SELECT VARCHAR2(2000):= NULL;

开始在

为REC(选择从USER_TAB_COLUMNS COLUMN_NAME在表格名= 'TABLE1' 和列名<> 'ID_T')环

V_SELECT:= NULL;

V_SELECT:= V_SELECT || rec.COLUMN_NAME;

q:='SELECT t1.id_t AS Id,'''|| V_SELECT ||'''AS nom_champ,t1。'|| V_SELECT ||'如上所述,t2。'|| V_SELECT ||' AS例外'||

'FROM TABLE1 t1 INNER JOIN TABLE2 t2 ON t1.id_t = t2.id_t WHERE t1。'|| V_SELECT ||' <> t2。'|| V_SELECT;

q:='INSERT INTO TABLE3'|| q;

dbms_output.put_line('Query:'|| q);

立即执行q;

end loop; 结束;