比较两个表并选择表2中的no记录

时间:2015-08-06 11:50:00

标签: sql oracle

我想写一个将比较两个表的select查询。通过比较,它应该告诉您需要从表2中更新,插入或删除哪条记录。

表格内容:

Table 1
----- ---------
 id    name
----- ---------
 1     shubham
 2     ravi
 3     aman
 4     vijay


Table 2
----- ---------
 id    name
----- ---------
 1     shubham
 2     ravi
 3     aman
 4     vijay

现在,当table1中的数据发生变化时,这两个表都有相同的数据

Table 1
----- ---------
 id    name
----- ---------
 1     shubham
 2     harish
 3     aman                        
 5     saurabh

现在在table1中更新了id 2的名称并删除了id 4,同时插入了id。我希望我的查询从表1中选择所有这些记录,并告知是否要执行哪些操作。我也不想使用set运算符。请帮忙

3 个答案:

答案 0 :(得分:1)

此解决方案中没有涉及设置操作符,但是当不仅要比较几列时,它们可能更容易使用:

select coalesce(s.id, d.id) id
     , coalesce(s.name, d.name) name
     , case when s.id is null then 'D'
            when d.id is null then 'C'
            when s.name != d.name then 'U'
       end CUD
  from table1 s
  full join table2 d
    on s.id = d.id
 where s.id is null
    or d.id is null
    or s.name != d.name

CUD列仅表示执行C reate,U pdate或D elete的操作。更灵活的基于集合的解决方案将是这样的:

select 'CU' op, s.* from table1 s
minus
select 'CU' op, d.* from table2 d
union
select 'D' op, d.* from table2 d where d.id not in (select s.id from table1 s)

在这种情况下,您不知道在减号操作之后,table1记录是新记录还是已更改,因此op是C reate或U pdate,但您仍然明确知道D elete操作。

可以在MERGE语句的USING子句中使用其中一个查询来更新table2以匹配table1

答案 1 :(得分:0)

SELECT 
TEST1.NAME,TEST1.CLASS,test2.name,test2.class,
case  when test1.name 
is null then 'deleted'  
when UPPER(test1.name)!=UPPER(test2.name) then 'insert'
when test2.name is null then 'updated' ELSE 'no change' end as flag
FROM    TEST1
full outer join TEST2
  ON  
 test2.class=test1.class;

答案 2 :(得分:0)

我会这样做:

select coalesce(t1.id, t2.id) id, t1.name new_name, t2.name old_name,
    case when t1.id is null then 'row deleted'
         when t2.id is null then 'row inserted'
         when t1.name <> t2.name  
           or t1.name is null and t2.name is not null
           or t1.name is not null and t2.name is null
         then 'data changed'
    end change
  from t1 full join t2 on t1.id = t2.id order by id

enter image description here

顺便说一句,在你的问题中格式化数据有什么用呢?只需在某些内容之前添加4个空格,这将表示为代码。或者选择一些部分并按[Ctrl-K]。一切都是在你写的时候呈现的。