编写单个SQL查询以显示已租用且同时未由MS Access中的客户租用的电影列表

时间:2017-05-20 09:43:27

标签: sql ms-access

电影表格包含以下列:

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中的外观如何?

1 个答案:

答案 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,您将失去这些电影记录。