sql - 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
此查询不会给出确切的输出
请帮忙
解决方案
如果您使用 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%';
推荐阅读
- java - Mockserver 客户端 Java - 使用默认的 JDK 信任库
- javascript - 在Javascript的forEach循环中使用异步等待时没有得到正确的输出
- apache-hudi - [HUDI]在 HUDI 中创建仅附加原始数据
- excel - 通过 Delphi 在 Excel 中构建数据透视表
- r - 如何将一个值除以R中上一年的相同值?(回报计算)
- c# - 旧的 Code-First 模型在数据库中有字段,但在模型中没有
- amazon-web-services - AWS API 网关和 GET 请求正文
- python - 如何从具有许多数组的数组中获取值 - Python
- python - 更改聚合子句是否会更改 pandas_udf - pyspark 中的任何内容?
- bash - 如何列出 OCI 中所有计算实例的公共 IP?