【发布时间】:2018-12-12 11:05:21
【问题描述】:
我有三个表,我想使用基于table1 和table2 的条件查询table3。以下是数据和查询的简化版本:
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));
我收到了这个错误:
错误:编译语句时出错:FAILED: 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 子句。
【问题讨论】:
标签: sql hadoop select hive subquery