一个月前我开始学习SQL,发现了SAKILA这项作业,并认为我应该尝试一下以测试自己。我在做运动时有些卡住,我不知道自己在做错什么。有人可以帮我吗?
问题是:
查找所有名字和ID为8的演员的名字相同的所有演员的名字(姓和名)。不要返回ID为8的演员的名字。请注意,您不能将ID为8的角色名称用作常量(仅ID)。解决此问题的方法不止一种,但是您只需要提供一种解决方案即可。
我的代码是:
1。
SELECT customer.first_name,customer.last_name FROM customer
LEFT JOIN actor ON (customer.first_name LIKE actor_id=8)
AND (actor.first_name LIKE actor_id=8)
2。
SELECT customer.first_name,customer.last_name FROM customer
LEFT JOIN actor ON customer_id=actor_id
WHERE (customer.first_name LIKE actor_id=8) AND (actor.first_name LIKE actor_id=8)
我得到了很多返回的名字,但是没有一个是正确的名字。我究竟做错了什么?为什么代码未返回与演员ID为8的相同名称。
答案 0 :(得分:3)
由于您需要合并演员和戏服者的名字,因此我们将首先使用UNION。然后,该结果集与参与者8结合在一起以匹配名字。
SELECT s.first_name,s.last_name
FROM (
SELECT c.first_name,c.last_name
FROM customer c
UNION ALL
SELECT a.first_name,a.last_name
FROM actor a
WHERE a.actor_id != 8
) as s
JOIN actor a8 ON a8.first_name = s.first_name
WHERE a8.actor_id=8
答案 1 :(得分:0)
您需要获得演员以及客户名称。两者都在两个不同的表中。因此一种方法可以是使用UNION ALL
。
(SELECT customer_id AS id,
first_name,
last_name
FROM customer
WHERE first_name = (SELECT first_name FROM actor WHERE actor_id = 8))
UNION ALL
(SELECT actor_id AS id,
first_name,
last_name
FROM actor
WHERE actor_id <> 8 AND
first_name = (SELECT first_name FROM actor WHERE actor_id = 8))
答案 2 :(得分:-1)
我会说
Select C.firstName, C.lastName
from Customer C, actor A
where C.firstName=A.firstName and C.lastName=A.lastName and A.id=8
这意味着,您正在数据库中搜索“客户”表中的所有记录,其中名字和姓氏与表Actor的ID为8的记录中的名字和姓氏完全相同。之所以使用“和”,是因为您希望所有条件都同时为真。您不需要从演员那里提取任何东西,因为您不需要它:它是内部执行的“选择”;无论如何,您还应该从客户那里提取其他重要数据,否则只会得到一堆所有相同的行。
查询n°2:
Select A.fistName, A.lastName
from actor A
where A.firstName=(
select firstName
from actor where id=8
) and A.lastName=(
select lastName
from actor where id=8
) and id<>8
您必须使用子查询,即()之间的“选择”;那是因为如果您在表actor中搜索id = 8,则只会得到一行,即id = 8的那一行。通过子查询,数据库首先获取要用于比较的数据,然后才搜索其他行。