SQL联接问题

时间:2018-07-03 04:40:24

标签: sql join oracle11g

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

例如

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  

此查询不会提供确切的输出

请帮助

4 个答案:

答案 0 :(得分:0)

如果您使用union,则可以获取所需的列表(请注意,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%';

答案 1 :(得分:0)

UNION运算符返回组合查询的唯一行。因此,只需使用

SELECT * FROM sql_test_a UNION SELECT * FROM sql_test_b

要使用WHERE子句过滤结果,可以使用子查询。例如

SELECT *
FROM (SELECT * FROM sql_test_a UNION SELECT * FROM sql_test_b)
WHERE ID > 3

另请参阅live fiddle

答案 2 :(得分:-1)

(   SELECT * FROM sql_test_a 
MINUS
SELECT * FROM sql_test_b)  UNION ALL(   SELECT * FROM sql_test_b
MINUS
SELECT * FROM sql_test_a ) 

答案 3 :(得分:-1)

请尝试这个

(SELECT * FROM sql_test_1 )UNION ALL(SELECT * FROM sql_test_b 除了 SELECT * FROM sql_test_1)