SQL, ГДЕ существуют оба значения переменной

#sql #select

#sql #выберите

Вопрос:

Предположим, что у меня есть таблица с информацией о глобальных кассовых сборах, включающая столбцы «Название фильма», «страна» и «доходы». Вопрос в том, как узнать фильмы, которые продаются лучше в стране A, чем в стране B. Вот мой ответ:

 SELECT filmName 
FROM Boxoffice 
WHERE (SELECT earnings FROM Boxoffice WHERE country = "A") > 
(SELECT earnings FROM Boxoffice WHERE country = "B") 
GROUP BY filmName
  

Но потом я узнал, что есть некоторые фильмы, которые не показывают в обеих странах. Интересно, как я могу добавить условие к фильмам, которые показываются в обеих странах, к моему существующему ответу. И я также понятия не имею, есть ли в моем ответе какие-либо проблемы, поскольку у меня нет реальных данных.

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

1. Какую СУБД вы используете? Вы должны всегда помечать SQL-запросы соответствующей СУБД. Иногда даже необходимо знать версию. Кстати, строковые литералы должны быть заключены в одинарные кавычки. Основная проблема с вашим запросом заключается в том, что подзапросы не коррелированы, то есть они не ищут film вашего основного запроса. (И GROUP BY в основном запросе выглядит странно, поскольку вы не применяете какую-либо агрегатную функцию. SELECT DISTINCT В этом случае мы предпочли бы использовать. И в базе данных было бы лучше с отдельной таблицей film.)

2. Что касается «поскольку у меня нет реальных данных»: легко настроить некоторые тестовые данные и попробовать их. Я использую dbfiddle.uk для этого. Будет здорово, если вы сделаете это в следующий раз. Это поможет вам проверить ваш собственный запрос, и это поможет нам проверить наш. Вот ваши данные с нашими запросами: dbfiddle.uk /…

Ответ №1:

Я думаю, что самосоединение было бы проще:

 SELECT a.filmname
FROM   boxoffice a
JOIN   boxoffice b ON a.country = 'A' AND b.country = 'B' AND a.earnings > b.earnings;
  

Ответ №2:

Похоже filmname , и country это уникальный ключ для вашей таблицы, т. Е. Для каждого фильма и страны есть одна строка.

Один из способов получить фильмы, которые продаются лучше в стране A, чем В, — это объединить и сравнить доходы в HAVING предложении:

 select filmname 
from boxoffice 
group by filmname
having max(case when country = 'A' then earnings end) >
       max(case when country = 'B' then earnings end)
order by filmname;
  

Другой способ — объединить, например:

 select a.filmname
from (select * from boxoffice where country = 'A') a
join (select * from boxoffice where country = 'B') b
  on a.filmname = b.filmname and a.earnings > b.earnings
order by a.filmname;