我正在尝试排除SQL中内部查询的结果(我目前正在Google的云平台上工作(,我有下表:
date | name
-----------+------------
2019-09-10 | gas_300x10
2019-09-10 | gas_250x10
2019-09-10 | gas_3x3
2019-09-11 | gas_300x10
2019-09-11 | gas_250x10
2019-09-11 | gas_4x4
我正在尝试排除名称等于 gas_300x10 的值,并且仅在2019-09-10日期gas_250x10!
我想保留该日期的其他值,还想保留其他日期gas_300x10和gas_250x10发生的位置,例如 2019-09-11 当天。
我有以下查询,它排除了我不想要的日期的值- 所以我不想要 2019-09-10 的两个值:
SELECT *
FROM my_table
WHERE date = '2019-09-10'
AND (name = 'gas_300x10' OR name = 'gas_250x10')
此查询基本上会返回我不想要的那些值 - 如何将其嵌入为内部查询,以便将这些结果从其余数据中排除?
我尝试使用EXCEPT
和NOT IN
作为子查询,但没有找到任何运气!
我认为代码会像这样工作,但我不确定:
SELECT *
FROM my_table
EXCEPT
SELECT *
FROM my_table
WHERE date = '2019-09-10'
AND (name = 'gas_300x10' OR name = 'gas_250x10')
使用组合表达式:
select *
from mytable
where not (date = date '2019-09-10' and name in ('gas_300x10', 'gas_250x10'));
或
select *
from mytable
where date <> date '2019-09-10' or name not in ('gas_300x10', 'gas_250x10');
我建议NOT
:
SELECT *
FROM my_table
WHERE NOT (date = '2019-09-10' AND
name IN ('gas_300x10', 'gas_250x10')
);
请注意使用IN
来简化逻辑。
或者,您可以将其编写为:
SELECT *
FROM my_table
WHERE date <> '2019-09-10' OR
name NOT IN ('gas_300x10', 'gas_250x10');
这两者都假设date
和name
不是NULL
。 如果可能的话,可以调整逻辑以非常轻松地处理此问题。
我不建议使用EXCEPT
. 首先,它删除重复项,因此它不会执行完全相同的逻辑。 其次,它所做的工作比必要的要多得多,匹配两个子查询的结果,而不仅仅是过滤一个表。