Где и где SQL

У меня есть база данных. Я хотел посмотреть фильмы с английскими и испанскими субтитрами. Я хочу сделать такой запрос sql, и он не работает.

SELECT name,language FROM DvD 
JOIN Subtitles ON  Dvd.dvdID=Subtitle.dvdID 
where language='EN' and language='ES';

Но когда я попытался сделать так, это работает.

SELECT name,language FROM DvD 
JOIN Subtitles ON  Dvd.dvdID=Subtitle.dvdID 
where language='EN' or language='ES';

person alongova    schedule 25.06.2020    source источник


Ответы (2)


На самом деле вам нужна агрегация, если вы хотите, чтобы DVD-диски имели оба:

SELECT dvd.name
FROM DvD JOIN
     Subtitles s
     ON Dvd.dvdID = s.dvdID
WHERE s.language IN ('EN', 'ES')
GROUP BY dvd.name
HAVING COUNT(*) = 2;  -- both are present!

Ваша версия возвращает DVD с английским или испанским языком, но не обязательно с обоими.

person Gordon Linoff    schedule 25.06.2020

Ваш второй запрос не делает то, что вы хотите. Он проверяет, есть ли на DVD хотя бы один из двух языков (что отличается от наличия обоих).

Вы можете проверить оба с помощью exists:

SELECT name, language 
FROM DvD d
WHERE 
    EXISTS (SELECT 1 FROM Subtitles s WHERE s.dvdID = d.dvdID AND language='EN')
    AND EXISTS (SELECT 1 FROM Subtitles s WHERE s.dvdID = d.dvdID AND language='ES')

С индексом subtitles(dvdID, language) этот вариант должен быть более эффективным, чем альтернатива с использованием объединения и агрегации (хотя писать ее немного дольше).

Вы также можете сделать это с помощью совокупного suqbuery:

SELECT name, language 
FROM DvD d
WHERE (
    SELECT COUNT(*)
    FROM Subtitles s 
    WHERE s.dvdID = d.dvdID AND language IN ('EN', 'ES')
) = 2
person GMB    schedule 25.06.2020