У меня есть набор tableA
Я хочу убедиться, что этот человек из Берлина, Сингапура и Токио, все три города присутствуют в таблице.
У меня есть этот SQL-запрос, чтобы проверить наличие каждого города.
select a.*
from (
select *,
row_number() over (partition by city ) as rn
from tableA
where city in (Berlin, Tokyo, Singapore)
) a
where rn = 1
С помощью этого запроса я могу узнать, что присутствует как минимум 1 человек из этих стран, а из Берлина на самом деле нет ни одного. Я хочу, чтобы запрос мог подтвердить наличие всех городов, находящихся в состоянии IN
. Он вернется True
если все они присутствуют и False
если один из них отсутствует. Возможно ли это сделать? Предложение по более простому запросу также приветствуется.
Вы можете определить города, которые отсутствуют в данных, используя левое соединение с CTE, содержащим данные для городов:
WITH cities(name) as (values 'Berlin', 'Tokyo', 'Singapore') -- define the cities
select cities.name
from cities
left join tableA on cities.name = tableA.City
where tableA.Name is null;
Выход
name
--------
Berlin
Вы можете сравнить количество городов в IN(...) и количество строк вывода запроса.
select case when count(*)=3 then 'true' else 'false' end res
from (
select *,
row_number() over (partition by city order by name) as rn
from tableA
where city in ('Berlin', 'Tokyo', 'Singapore')
) a
where rn = 1
рез = 'ложь'
ИЛИ проще
select case when count(*)=3 then 'true' else 'false' end res
from(
select distinct city
from tableA
where city in ('Berlin', 'Tokyo', 'Singapore')
) a
Пример
По предложению @jarlh
select case when count(distinct city)=3 then 'true' else 'false' end res
from tableA
where city in ('Berlin', 'Tokyo', 'Singapore')
Я не могу проверить это на amazon-athena, но это прекрасное решение!
Вы даже можете сделать count(distinct city)=3
и пропустить подзапрос.
@jarlh, ты можешь предложить это как отдельный ответ. Мне кажется, это самое элегантное решение.
Незачем. Это ваш запрос немного улучшился.
«но это красивое решение» — у него есть небольшая проблема — редактирование количества городов требует редактирования условия подсчета.
Возможно, список городов динамически генерируется интерфейсом, и checkCount является одним из параметров. Кроме того, я думаю, что это простой случай, когда запрос возвращает количество городов, а лицевая сторона сравнивает это значение с количеством городов в списке параметров. query_result=CityList.Count
Если список городов является результатом другого запроса, нужно смотреть контекст — запрос может быть совершенно другим.
Огромное спасибо ребята за ответы. у меня все работает.
RIGHT JOIN
3 города.
Посчитайте ненайденные.
Если 0, верните True, иначе верните False.
select case when count(*) = 0 then 'True' else 'False' end
from tableA
right join (values ('Berlin'), ('Tokyo'), ('Singapore')) c (city)
on tableA.city = c.city
where tableA.city is null
Вы можете присоединиться к городам.