Oracle SQL: 左连接查询 - 子集匹配和条件筛选

在数据库操作中,我们经常遇到需要根据子集表中的条件筛选主表数据的情况。本文将介绍如何使用Oracle SQL中的左连接(LEFT JOIN)实现这一目标,并提供详细的示例代码和解释。

基本概念

左连接(LEFT JOIN)是一种常用的连接操作,它返回左表(主表)中的所有记录,以及与右表(子表)匹配的记录。如果左表中的记录在右表中没有匹配的记录,则右表中的字段值将显示为NULL。

示例

假设我们有两个表:A表和B表,B表是A表的子集。我们要查询A表中不在B表的数据,同时满足一些条件时才显示B表中的数据。以下将提供示例代码和解释,并逐步改进。

示例1:基本左连接

此示例演示了基本的左连接操作,查询A表中所有不在B表的数据。

CREATE TABLE A ( a1 INT, a2 VARCHAR(50) );
CREATE TABLE B ( b1 INT, b2 VARCHAR(50) );
INSERT INTO A VALUES (1, 'A1');
INSERT INTO A VALUES (2, 'A2');
INSERT INTO A VALUES (3, 'A3');
INSERT INTO A VALUES (4, 'A4');
INSERT INTO B VALUES (2, 'B2');
INSERT INTO B VALUES (4, 'B4');
SELECT A.a1, A.a2
FROM A
LEFT JOIN B ON A.a1 = B.b1
WHERE B.b1 IS NULL;

结果:

a1 | a2
--------- 1 | A1 3 | A3

示例2:条件筛选

此示例演示了根据B表中的条件筛选A表数据。

CREATE TABLE A ( a1 INT, a2 VARCHAR(50), a3 INT );
CREATE TABLE B ( b1 INT, b2 VARCHAR(50), b3 INT );
INSERT INTO A VALUES (1, 'A1', 10);
INSERT INTO A VALUES (2, 'A2', 20);
INSERT INTO A VALUES (3, 'A3', 30);
INSERT INTO A VALUES (4, 'A4', 40);
INSERT INTO B VALUES (2, 'B2', 20);
INSERT INTO B VALUES (4, 'B4', 30);
SELECT A.a1, A.a2, A.a3
FROM A
LEFT JOIN B ON A.a1 = B.b1 AND B.b3 = 30
WHERE B.b1 IS NULL OR (B.b1 IS NOT NULL AND A.a1 = B.b1 AND B.b3 = 30);

结果:

a1 | a2 | a3
-------------- 1 | A1 | 10 2 | A2 | 20 3 | A3 | 30 4 | A4 | 40

示例3:左连接放在WHERE条件

此示例演示了将左连接放在WHERE条件中实现相同的结果。

CREATE TABLE A ( a1 INT, a2 VARCHAR(50) );
CREATE TABLE B ( b1 INT, b2 VARCHAR(50) );
INSERT INTO A VALUES (1, 'A1');
INSERT INTO A VALUES (2, 'A2');
INSERT INTO A VALUES (3, 'A3');
INSERT INTO A VALUES (4, 'A4');
INSERT INTO B VALUES (2, 'B2');
INSERT INTO B VALUES (4, 'B4');
SELECT A.a1, A.a2
FROM A
WHERE A.a1 IN (SELECT b1 FROM B WHERE b2 = 'B4') OR A.a1 NOT IN (SELECT b1 FROM B);

结果:

a1 | a2
--------- 1 | A1 2 | A2 3 | A3 4 | A4

总结

本文介绍了Oracle SQL中的左连接操作,并演示了如何使用左连接查询子集匹配和条件筛选数据。希望本文能够帮助您更好地理解和应用左连接操作,提高您的数据库操作效率。


原文地址: https://www.cveoy.top/t/topic/qe94 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录