#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;