我有一个关系数据库架构,如下所示:
问题是“查找2009年购买产品的客户的详细信息,产品由霍尼韦尔于1968年制造”。
到目前为止我所做的是:
SELECT * FROM Customer
WHERE CID IN
(SELECT Customer_ID FROM Order
WHERE Purchase_Date = 2009
AND EXISTS
(SELECT * FROM Order_Items, Product, Manufacturer
WHERE OID = OID AND Product_ID = PID AND MID = Manufacturer_ID AND
Mnufacturer_Name = "Honeywell" AND Manufacturerd_Date = 1968));
我一直在研究数据库大约一个月,所以我想这里的专家们看起来很复杂..我这样做了吗?否则,请提供任何反馈意见..
提前致谢。
答案 0 :(得分:2)
通常,当从关系数据库中的相关表中检索信息时,您应该使用适合您从查询中获取的结果的连接类型JOIN
表。是否包括外表中不匹配的行。所以,在你的情况下,你可以这样做:
SELECT DISTINCT c.*
FROM Customer c
INNER JOIN Order o ON c.CID = o.Customer_ID
INNER JOIN OrderItems oi ON o.OID = oi.OID
INNER JOIN Product p ON oi.ProductID = p.PID
INNER JOIN Manufacturer m ON p.Manufacturer_ID = m.MID
WHERE o.Purchase_Date = 2009
AND m.Mnufacturer_Name = "Honeywell"
AND m.Manufacturerd_Date = 1968
但是,在您发布的查询中:
SELECT * FROM Customer
WHERE CID IN
(SELECT Customer_ID FROM Order
WHERE Purchase_Date = 2009
AND EXISTS
(SELECT * FROM Order_Items, Product, Manufacturer
WHERE OID = OID AND Product_ID = PID AND MID = Manufacturer_ID AND
Mnufacturer_Name = "Honeywell" AND Manufacturerd_Date = 1968));
您正在使用IN
谓词,并使用旧的联接语法Order_Items
加入三个表Product
,Manufacturer
和.. FROM Order_Items, Product, Manufacturer WHERE OID = OID AND Product_ID = PID AND MID = Manufacturer_ID
您的查询可能有效。但是,如果NULL
有任何Customer_ID
值,则不会返回任何结果。但是使用JOIN
会更容易。以下是关于JOIN
: