首页 > 解决方案 > SQL 加入问题

问题描述

我有两个不同的表,但两个表可能有也可能没有相同的记录。我需要加入这些表并获取这两个表的所有不同记录

例如

CREATE TABLE sql_test_a 
( 
    ID         VARCHAR2(4000 BYTE), 
    FIRST_NAME VARCHAR2(200 BYTE), 
    LAST_NAME  VARCHAR2(200 BYTE) 
); 

CREATE TABLE sql_test_b 
( 
    ID         VARCHAR2(4000 BYTE), 
    FIRST_NAME VARCHAR2(200 BYTE), 
    LAST_NAME  VARCHAR2(200 BYTE) 
); 

INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('1', 'John', 'Snow'); 

INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('2', 'Mike', 'Tyson'); 

INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('3', 'Bill', 'Keaton'); 

INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('4', 'Greg', 'Mercury'); 

INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('5', 'Steve', 'Jobs'); 

INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('6', 'Stsdsdve', 'Josdsbs');

INSERT INTO sql_test_b (ID, FIRST_NAME, LAST_NAME) VALUES ('1', 'John', 'Snow'); 

INSERT INTO sql_test_b (ID, FIRST_NAME, LAST_NAME) VALUES ('2', 'Mike', 'Tyson'); 

INSERT INTO sql_test_b (ID, FIRST_NAME, LAST_NAME) VALUES ('3', 'Bill', 'Keaton'); 

INSERT INTO sql_test_b (ID, FIRST_NAME, LAST_NAME) VALUES ('4', 'Greg', 'Mercury'); 

INSERT INTO sql_test_b (ID, FIRST_NAME, LAST_NAME) VALUES ('5', 'Steve', 'Jobs'); 

INSERT INTO sql_test_b (ID, FIRST_NAME, LAST_NAME) VALUES ('7', 'Johhny', 'Depp');

INSERT INTO sql_test_b (ID, FIRST_NAME, LAST_NAME) VALUES ('8', 'Johhnaaaay', 'Deaaap');

这些是表格和表格中的记录

并且例外的输出应该是

ID  FIRST_NAME  LAST_NAME
1   John        Snow
2   Mike        Tyson
3   Bill        Keaton
4   Greg        Mercury
5   Steve       Jobs
6   Stsdsdve    Josdsbs
7   Johhny      Depp
8   Johhnaaaay  Deaaap

我尝试了不同的连接,如左外连接、全外连接等

SELECT a.ID,a.FIRST_NAME,a.LAST_NAME
  FROM sql_test_a a left outer join sql_test_b b on a.ID=b.ID 
  and a.FIRST_NAME=b.FIRST_NAME 
  and a.LAST_NAME=b.LAST_NAME  

此查询不会给出确切的输出

请帮忙

标签: sqljoinoracle11g

解决方案


如果您使用 aunion您可以获得所需的列表(请注意,union all根据您的数据可能会给您重复的行):

select a.id as id, a.first_name as first_name, a.last_name as last_name
from sql_test_a a

union

select b.id as id, b.first_name as first_name, b.last_name as last_name
from sql_test_b b

在这种情况下不鼓励使用连接,因为它会给您一个包含三列以上的表,并在(至少)其中之一上连接。

编辑

你提到你正在使用oracle。要过滤这个,你可以做几件事,其中之一是将查询包装在一个临时表中

with tmp as (

    select a.id as id, a.first_name as first_name, a.last_name as last_name
    from sql_test_a a

    union

    select b.id as id, b.first_name as first_name, b.last_name as last_name
    from sql_test_b b
)

select tmp.id, tmp.first_name, tmp.last_name
from tmp
where 
    tmp.first_name like '%whatever%';

推荐阅读