如何从表中获取其他表中不存在的所有值

时间:2014-04-01 10:47:00

标签: sql oracle

我有两张桌子说a和b

SQL> desc a;

 Name                                      Type
 ----------------------------------------- ----------------------------
 ID                                        NUMBER(38)    
 NAME                                      VARCHAR2(10)


SQL> desc b;

 Name                                      Type
 ----------------------------------------- ----------------------------
 ID                                        NUMBER(38)    
 NAME                                      VARCHAR2(10)

SQL>从a;

中选择*
    ID NAME
     1 a
     1 a
     1 a
     2 b
     2 b
     3 c
     3 c
     4 d

SQL> select * from b;

    ID NAME
     1 a
     2 b

我的输出应该是

    ID NAME
     1 a
     1 a
     2 b
     3 c
     3 c
     4 d

当我这样做时

SQL>从减号中选择* *从b;

    ID NAME
     3 c
     4 d

但这不是我想要的......请帮帮我

2 个答案:

答案 0 :(得分:1)

为什么名为id的列不是表中的唯一ID?一些命名惯例没有意义。

在任何情况下,您都会遇到问题,因为您有完全重复的行,无法区分它们。幸运的是,Oracle有一个解决方案。您可以使用row_number()rownum创建唯一密钥,然后使用此密钥删除重复项。

select a.*
from (select a.*, row_number() over (partition by id, name order by id) as seqnum
      from a
     ) a left outer join
     (select b.*, row_number() over (partition by id, name order by id) as seqnum
      from b
     ) b
     on a.id = b.id and a.seqnum = b.seqnum
where b.id is NULL;

答案 1 :(得分:0)

一种方法是

select id,type from
(
   select rownum,id,type from table1 minus select rownum,id,type from table2 
) temp