如何在 SQL 中排除内部查询的结果?

How to exclude the results of an inner query in SQL?

我试图排除 SQL 中的内部查询结果(我目前在 Google 的云平台上工作),我有以下 table:

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

我正在尝试排除 2019- 日期名称等于 gas_300x10 和 gas_250x10 的值09-10只!

我想保留该日期的其他值,还想保留 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') 

此查询基本上 return 我不想要的那些值 - 我如何将其嵌入为内部查询,以便将这些结果从其余数据中排除?

我试过使用 EXCEPTNOT IN 作为子查询,但没有找到任何运气!

我认为代码会像这样工作,但我不确定:

SELECT * 
FROM my_table 
EXCEPT
SELECT * 
FROM my_table 
WHERE date = '2019-09-10' 
  AND (name = 'gas_300x10' OR name = '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');

这两个假设 datename 不是 NULL。如果可能的话,可以调整逻辑以很容易地处理这个问题。

我不推荐使用 EXCEPT。首先,它删除了重复项,因此它不会执行完全相同的逻辑。其次,它做的工作比必要的多得多,匹配两个子查询的结果而不是只过滤一个 table.

使用组合表达式:

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');