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



我正在尝试排除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') 

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

我尝试使用EXCEPTNOT 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');

这两者都假设datename不是NULL。 如果可能的话,可以调整逻辑以非常轻松地处理此问题。

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

相关内容

  • 没有找到相关文章

最新更新