Как исключить результаты внутреннего запроса в SQL? - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь исключить результаты внутреннего запроса в SQL (в настоящее время я работаю на облачной платформе Googles), у меня есть следующая таблица:

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 и gas_250x10 только для даты 2019-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') 

Этот запрос по сути вернет те значения, которые мне не нужны - как я могу встроить это как внутренний запрос, чтобы эти результаты были исключены из остальных данных?

Я пытался использовать 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') 

Ответы [ 2 ]

3 голосов
/ 20 января 2020

Используйте комбинированное выражение:

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');
2 голосов
/ 20 января 2020

Я бы предложил NOT:

SELECT * 
FROM my_table 
WHERE NOT (date = '2019-09-10' AND
           name IN ('gas_300x10', 'gas_250x10') 
          );

Обратите внимание на использование IN для упрощения логики c.

В качестве альтернативы вы можете написать это как:

SELECT * 
FROM my_table 
WHERE date <> '2019-09-10' OR
      name NOT IN ('gas_300x10', 'gas_250x10');

Оба они предполагают, что date и name не NULL. Логика c может быть легко настроена, если это возможно.

Я бы НЕ рекомендовал использовать EXCEPT. Во-первых, он удаляет дубликаты, поэтому он не делает точно такой же лог c. Во-вторых, он выполняет гораздо больше работы, чем необходимо, сопоставляя результаты двух подзапросов, а не просто фильтруя одну таблицу.

...