sql - 带有左连接条件的sql查询
问题描述
下面是一个 SQL 查询:
SELECT ID, NAME FROM TABLE1 A
LEFT JOIN TABLE2 B
ON A.COLUMN1=B.COLUMN1
WHERE (
A.NAME = 'TEST'
OR
(NOT EXISTS (SELECT * FROM TABLE3 C
WHERE C.COLUMN1=A.COLUMN2
AND C.COLUMN2=B.COLUMN2)
AND
NOT EXISTS (SELECT * FROM TABLE4 D
WHERE D.COLUMN1=A.COLUMN2
AND D.COLUMN2=B.COLUMN2)));
目前似乎不支持,是否有不同的方法?
我已经尝试过的替代方案,但给出了不同的结果:
A.COLUMN2 NOT IN (SELECT DISTINCT COLUMN1 FROM TABLE3)
解决方案
您可以尝试重构以使用左反连接而不是存在子查询:
SELECT ID, NAME
FROM TABLE1 A
LEFT JOIN TABLE2 B
ON A.COLUMN1 = B.COLUMN1
LEFT JOIN TABLE3 C
ON C.COLUMN1 = A.COLUMN2 AND
C.COLUMN2 = B.COLUMN2
LEFT JOIN TABLE4 D
ON D.COLUMN1 = A.COLUMN2 AND
D.COLUMN2 = B.COLUMN2
WHERE
A.NAME = 'TEST' AND
C.COLUMN1 IS NULL AND
D.COLUMN1 IS NULL;
推荐阅读
- c# - C# 形式的“必须声明标量变量”错误是什么意思?
- android - Bitrise 无法安装缺少的 android 工具 - Fabric
- google-cloud-platform - 无法使用 PHP Google App Engine 连接 Cloud SQL
- javascript - 自己使用多个 for 循环或将逻辑委托给 Promise 是否更高效?
- java - 使用 Guava 的 Tables.toTable
- jquery - 更改文本框的最大长度值
- node.js - Windows Bash 脚本在不执行所有命令的情况下退出
- c - GCC C 并将整数传递给 PostgreSQL
- excel - Excel - 文本或数字公式
- ssis-2012 - 将 DT_WSTR 转换为 DT_DATE