2013-02-14 66 views
0

如何比较两个表并根据结果做出反应。例如。 我有2个表(确切结构):tableA(key,text)和tableB(key,text)和一个结果表(key,field,case)。sql - 比较表

if key is in tableA, but not in tableB --> case: insert 
if key is in tableB, but not in tableA --> case: delete 
if key is in tableA and in tableB, but the text is different -> update 
if key is in tableA and in tableB, and the text is the same -> nothing 

结果表如下所示:

key | text | case 
------------------ 
1 | t1 | update 
2 | t2 | delete 
3 | t3 | insert 
4 | t4 | nothing 

是否有可能只用一个查询办呢?

得到插入(和删除反之亦然):

SELECT key FROM tableA 
MINUS 
SELECT key FROM tableB; 

回答

0

这会帮助吗?

SELECT NVL (a.key, b.key) AS "KEY", 
     NVL (a.text, b.text) as "TEXT", 
     CASE 
      WHEN a.key IS NOT NULL AND b.key IS NULL THEN 
      'Insert' 
      WHEN a.key IS NULL AND b.key IS NOT NULL THEN 
      'Delete' 
      WHEN a.key IS NOT NULL AND b.key IS NOT NULL AND a.text != b.text THEN 
      'Update' 
      WHEN a.key IS NOT NULL AND b.key IS NOT NULL AND a.text = b.text THEN 
      'Nothing' 
     END 
      "CASE" 
    FROM tablea a FULL OUTER JOIN tableb b ON a.key = b.key; 
+0

这是我正在寻找并给我正确的结果。但是,如果我必须比较更多的文本列,那是什么。我是否必须将它们全部添加或是否有机会比较“比较除键之外的所有内容”? – Marc 2013-02-14 10:28:09

+0

除了添加全部内容之外,我现在想不出任何方法。 – 2013-02-14 10:34:17

0

我想你需要的东西是这样的:

select 'IN Table1, NOT Table2', Key_column 
    from user_tab_columns 
    where table_name = 'Table1' 
    MINUS 
    select 'IN Table1, NOT Table2', Key_column 
    from user_tab_columns 
    where table_name = 'Table2' 
) 
    UNION ALL 
    (
    select 'IN Table2, NOT Table1', Key_column 
    from user_tab_columns 
    where table_name = 'Table2' 
    MINUS 
    select 'IN Table2, NOT Table1', Key_column 
    from user_tab_columns 
    where table_name = 'Table1' 
) 

你可以找到这个概念的一些例子和变化中的链接:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1004115105172

祝你好运。