У меня есть два вопроса относительно упражнений # 15 sqlZoo (перечислите всех людей, которые работали с «Art Garfunkel».) В разделе «Больше операций JOIN». Решение выглядит так (это не мое):

SELECT actor.name 
FROM actor 
   INNER JOIN casting ON casting.actorid = actor.id 
WHERE casting.movieid IN(
       SELECT casting.movieid FROM casting 
       WHERE casting.actorid IN(
        SELECT actor.id FROM actor 
        WHERE actor.name = 'Art Garfunkel')) 
   AND actor.name <> 'Art Garfunkel'

Почти все выглядит просто, но последнее состояние меня интересует. Допустим, я изменю

WHERE casting.actorid IN(
        SELECT actor.id FROM actor 
        WHERE actor.name = 'Art Garfunkel'))

За

WHERE 
 casting.actorid = (SELECT actor.id FROM actor WHERE actor.name = 'Art Garfunkel'

Все работает нормально, но когда я ищу другие доступные решения, каждый из них использует оператор IN, как показано выше. Есть ли причина для использования оператора IN вместо предложенного мной решения? Второй вопрос: почему я не могу изменить (строка 7) SELECT actor.id FROM actor на SELECT casting.actorid FROM casting? Я имею в виду, что actor.id и casting.actorid одинаковы (оба столбца содержат идентификатор актера). Так почему (в этом конкретном примере) они не являются взаимозаменяемыми?

sql
0
beginsql 9 Июн 2019 в 23:08

2 ответа

Лучший ответ

Я бы назвал это ленью. Столбец id в actor является и должен быть уникальным.

Использование = на самом деле является преимуществом для компилятора SQL. В нем четко указано, что подзапрос должен возвращать не более одной строки, и это может - иногда в некоторых базах данных - приводить к лучшему плану выполнения.

0
Gordon Linoff 9 Июн 2019 в 20:25

Вы можете использовать = только тогда, когда уверены, что подзапрос возвращает одну строку:

WHERE 
 casting.actorid = (SELECT actor.id FROM actor WHERE actor.name = 'Art Garfunkel')
                    -- subquery should return single row

В противном случае вы получите ошибку:

SQL Server Подзапрос вернул более одного значения. Это не разрешено, если подзапрос следует за =,! =, <, <=,>,> = Или когда подзапрос используется как выражение.

< Сильный > PostgreSQL ОШИБКА: более одной строки, возвращенной подзапросом, используемым в качестве выражения

< Сильный > MySQL Подзапрос возвращает более 1 ряд

3
Lukasz Szozda 9 Июн 2019 в 20:09