如何在 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 我不想要的那些值 - 我如何将其嵌入为内部查询,以便将这些结果从其余数据中排除?
我试过使用 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')
我建议 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
。首先,它删除了重复项,因此它不会执行完全相同的逻辑。其次,它做的工作比必要的多得多,匹配两个子查询的结果而不是只过滤一个 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');
我试图排除 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 我不想要的那些值 - 我如何将其嵌入为内部查询,以便将这些结果从其余数据中排除?
我试过使用 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')
我建议 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
。首先,它删除了重复项,因此它不会执行完全相同的逻辑。其次,它做的工作比必要的多得多,匹配两个子查询的结果而不是只过滤一个 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');