sql - 在 WHERE 谓词解决方法中配置多个子查询
问题描述
我有三个表,我想table3
使用基于table1
和的条件进行查询table2
。这是数据和查询的简化版本:
CREATE TABLE table1 (
id int
);
INSERT INTO table1 VALUES(1);
INSERT INTO table1 VALUES(2);
INSERT INTO table1 VALUES(3);
+------------+--+
| table1.id |
+------------+--+
| 1 |
| 2 |
| 3 |
+------------+--+
CREATE TABLE table2 (
code varchar(10)
);
INSERT INTO table2 VALUES('a');
INSERT INTO table2 VALUES('b');
INSERT INTO table2 VALUES('c');
+--------------+--+
| table2.code |
+--------------+--+
| a |
| b |
| c |
+--------------+--+
CREATE TABLE table3 (
id int,
code varchar(10)
);
INSERT INTO table3 VALUES(1,'d');
INSERT INTO table3 VALUES(1,'a');
INSERT INTO table3 VALUES(2,'b');
INSERT INTO table3 VALUES(2,'e');
INSERT INTO table3 VALUES(4,'a');
INSERT INTO table3 VALUES(4,'d');
+------------+--------------+--+
| table3.id | table3.code |
+------------+--------------+--+
| 1 | d |
| 1 | a |
| 2 | b |
| 2 | e |
| 4 | a |
| 4 | d |
+------------+--------------+--+
table3
基本上,我喜欢仅在id
存在于table1
和code
不存在于的情况下从中获取记录table2
。所以结果应该只是
1,d
2,e
以下查询不起作用:
SELECT * FROM table3 WHERE (table3.id IN (SELECT table1.id FROM
table1)) AND NOT (table3.code IN (SELECT table2.code FROM table2));
我收到了这个错误:
错误:编译语句时出错:失败:SemanticException [错误 10249]:第 1:94 行不支持子查询表达式“代码”:仅支持 1 个子查询表达式。(状态=42000,代码=10249)
独立地,每个条件都可以正常工作:
SELECT * FROM table3 WHERE (table3.id IN (SELECT table1.id FROM table1));
+------------+--------------+--+
| table3.id | table3.code |
+------------+--------------+--+
| 1 | d |
| 1 | a |
| 2 | b |
| 2 | e |
+------------+--------------+--+
SELECT * FROM table3 WHERE NOT (table3.code IN (SELECT table2.code FROM table2));
+------------+--------------+--+
| table3.id | table3.code |
+------------+--------------+--+
| 1 | d |
| 2 | e |
| 4 | d |
+------------+--------------+--+
重要提示:我不能做JOIN
或修改任何事情,FROM
因为这是报告系统的一部分,所以我唯一能做的就是调整 WHERE 子句。
解决方案
您可以使用JOIN
s 重写它:
SELECT DISTINCT t3.*
FROM table3 t3
JOIN table1 t1
ON t3.id = t1.id
LEFT JOIN table2 t2
ON t2.code = t3.code
WHERE t2.code IS NULL;
我唯一能做的就是调整 WHERE 子句。
SELECT *
FROM Table3 t
WHERE EXISTS (SELECT 1
FROM table3 t3
JOIN table1 t1
ON t3.id = t1.id
LEFT JOIN table2 t2
ON t2.code = t3.code
WHERE t2.code IS NULL
AND t3.id = t.id
AND t3.code = t.code)
推荐阅读
- wordpress - 最近更新到 wordpress 后代码段不起作用
- opengl - Opengl/Glut 键盘输入问题
- if-statement - If True 结果基于 2 个结果的查询输出
- python - python:子类不能使用父变量
- python - 鸭子类型的用户定义类
- ggplot2 - cox 回归图的风险数
- laravel - Laravel 将一个 sass 混合到多个 css
- ansible - Ansible,如何检查变量是否不为空?
- c# - 如何找到 ASP.net SQL 插入查询中的错误?
- parallel-processing - 为多个组并行运行 Ansible Taks