电影表格包含以下列:
Movie (Movie_ID, Movie_Title)
Customer Table包含以下列:
Customer (Cus_No, Cus_FName, Cus_LName)
租赁表包含以下列:
Rental (Rental_ID, Cus_No, Movie_ID)
现在这是个问题:
通过使用单个SQL查询(在MS Access中),列出所有电影的名称,并为所有电影列出已雇用它的所有客户的名称。如果从未雇用过电影,那么无论如何都要列出。按电影名称和客户姓氏对最终结果进行排序。
这就是我接触的方式
SELECT Movie_Title, Cus_LName, Cus_FName
FROM Movie, Customer, Rental
WHERE Movie.Movie_ID = Rental.Movie_ID AND NOT (Movie.Movie_ID = Rental.Movie_ID)
AND Customer.Cus_No = Rental.Cus_No AND NOT (Customer.Cus_No = Rental.Cus_No)
ORDER BY Movie_Title, Cus_LName;
但是,我得到了空白的结果。
对于此问题,SQL查询在MS Access中的外观如何?
答案 0 :(得分:0)
你没有得到结果的原因是你的条件是矛盾的:
你有:
Movie.Movie_ID = Rental.Movie_ID AND NOT (Movie.Movie_ID = Rental.Movie_ID)
...但是这两个条件在同一时间永远不会成立,但是你要求它们与AND
一致。
你真正想要的是outer joins。
SELECT Movie_Title, Cus_LName, Cus_FName
FROM (Movie
LEFT JOIN Rental ON Movie.Movie_ID = Rental.Movie_ID)
LEFT JOIN Customer ON Customer.Cus_No = Rental.Cus_No
ORDER BY Movie_Title, Cus_LName
这样,即使第一个ON
子句中的条件与Rental记录不匹配,仍会列出Movie记录。在这种情况下,SQL引擎将使用null
填充客户名称的缺失值。这正是LEFT JOIN
的用途。使用WHERE
,您将失去这些电影记录。