SQL — выбор всех строк с несовпадающими нулевыми строками

#sql #postgresql #subquery #window-functions #sql-null

#sql #postgresql #подзапрос #окно-функции #sql-null

Вопрос:

Как я могу выбрать все строки, которые имеют не совпадающую нулевую строку? Учитывая следующую таблицу, любая строка с внешним ключом 1 не должна быть возвращена, поскольку существует соответствующая строка с нулевым значением. Как я мог выбирать только строки с внешними ключами 2 и 3?

 foreign_key | created_at
1             12345...
1             12345...
2             12345...
3             12345...
1             NULL
  

Комментарии:

1. Вы пытались SELECT * FROM TableName WHERE created_at IS NOT NULL ?

Ответ №1:

Вы можете использовать not exists :

 select *
from mytable t
where not exists (
    select 1 
    from mytable t1 
    where t1.foreign_key = t.foreign_key and t1.created_at is null
)
  

Другой вариант — использовать оконные функции; вот один из подходов, использующих логическое управление окнами:

 select *
from (
    select t.*, bool_or(created_at is null) over(partition by foreignkey) has_null
    from mytable t
) t
where not has_null