我使用Library数据库练习SQL,如下图所示你可以看到一些表是如何连接的。
我需要回复1996年以前出生的有孩子(少年)的图书馆成年人的收件人。我准备了SQL声明。 这个陈述对吗?可能不是,可以选择地址对于各种成员来说可以是相同的。我不知道如何接受这份声明。
SQL语句:
SELECT DISTINCT a.street,a.city,a.state,a.zip FROM adult AS a
JOIN juvenile AS j
ON a.member_no = j.adult_member_no
WHERE YEAR(j.birth_date) < 1996
答案 0 :(得分:2)
这是您的查询:
SELECT DISTINCT a.street, a.city, a.state, a.zip
FROM adult a JOIN
juvenile j
ON a.member_no = j.adult_member_no
WHERE YEAR(j.birth_date) < 1996;
假设列和表名称正确,则先验错误。它应该做你想要的。
这是最好的陈述吗?不会。问题是查询需要执行join
,然后执行聚合(对于distinct)。编写查询的另一种方法更接近于问题的陈述:
SELECT a.*
FROM adult a
WHERE EXISTS (SELECT 1
FROM juvenile j
WHERE a.member_no = j.adult_member_no AND
YEAR(j.birth_date) < 1996
);
您可以将此查询描述为:&#34;选择在1996年之前出生的少年的成年人。&#34;
请注意,此版本不需要select distinct
(除非adult
表中存在重复项,否则不太可能)。从技术上讲,这种形式的连接被称为&#34;半连接&#34;。 &#34;半&#34;是因为它可以在第一个匹配的行停止。一旦找到适合某个成年人的少年,就不再需要找到它了。