我在练习#15 sqlZoo(列出与“ Art Garfunkel”合作过的所有人员。)中有两个问题。解决方案如下所示(不是我的):
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和cast.actorid都相同(都是包含actor的ID的列)。那么为什么(在这个例子中)它们不能互换?
答案 0 :(得分:3)
仅当您确定子查询返回单行时才可以使用=
:
WHERE
casting.actorid = (SELECT actor.id FROM actor WHERE actor.name = 'Art Garfunkel')
-- subquery should return single row
否则,您将得到一个错误:
SQL Server 子查询返回的值超过1。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。
PostgreSQL 错误:由子查询返回的多于一行用作表达式
MySQL 子查询返回1行以上
答案 1 :(得分:0)
我称之为懒惰。 id
中的actor
列是-并且应该是唯一的。
使用=
实际上是SQL编译器的一个好处。它明确指定子查询最多返回一行,并且有时在某些数据库中可以导致更好的执行计划。