1

以下语句正常工作,但每条记录显示 4 次。重复; 我知道这种关系是错误的,但不知道如何解决?抱歉,如果这很简单并且我错过了它。

SELECT Customers.First_Name, Customers.Last_Name, Plants.Common_Name, Plants.Flower_Colour, Plants.Flowering_Season, Staff.First_Name, Staff.Last_Name
FROM Customers, Plants, Orders, Staff
INNER JOIN Orders AS t2 ON t2.Order_ID = Staff.Order_ID
WHERE Orders.Order_Date
BETWEEN  '2011/01/01'
AND  '2013/03/01'
4

3 回答 3

6

您正在表之间生成笛卡尔积,因为您没有在任何表之间提供连接语法:

SELECT c.First_Name, c.Last_Name, 
    p.Common_Name, p.Flower_Colour, p.Flowering_Season, 
    s.First_Name, s.Last_Name
FROM Customers c
INNER JOIN Orders o
    on c.customerId = o.customer_id 
INNER JOIN  Plants p
    on o.plant_id = p.plant_id
INNER JOIN Staff s
    ON o.Order_ID = s.Order_ID
WHERE o.Order_Date BETWEEN  '2011/01/01' AND  '2013/03/01'

注意:我在猜测连接的列名

这是一个很好的连接的视觉解释,可以帮助学习正确的语法

于 2013-01-07T20:08:04.590 回答
2

在该FROM...条款中,您正在执行交叉连接 - 将每个客户与每个工厂以及每个订单与每个员工相结合。

您应该只在子句中提及一个表,FROM然后将其他表连接起来INNER JOINS以仅获取相关记录。

我不知道你的数据库到底长什么样,但是是这样的:

SELECT Customers.First_Name, Customers.Last_Name, Plants.Common_Name,
Plants.Flower_Colour, Plants.Flowering_Season, Staff.First_Name, Staff.Last_Name
FROM Customers
INNER JOIN Orders ON Orders.Customer_ID = Customers.Customer_ID
INNER JOIN Staff ON Staff.Staff_ID = Orders.Staff_ID
INNER JOIN Plants ON Plants.Plants_ID = Orders.Plants_ID
WHERE Orders.Order_Date
BETWEEN  '2011/01/01'
AND  '2013/03/01'
于 2013-01-07T20:07:08.670 回答
2

这是因为您从四个表中进行选择,它们之间没有任何连接,并且还因为您要连接Orders两次。结果,得到了笛卡尔积

以下是您应该如何修复它:使用 ANSI 语法重新编写 theta 连接,并提供适当的连接条件:

SELECT Customers.First_Name, Customers.Last_Name, Plants.Common_Name, Plants.Flower_Colour, Plants.Flowering_Season, Staff.First_Name, Staff.Last_Name
FROM Customers
JOIN Plants ON ...
JOIN Orders ON ...
JOIN Staff ON ...
INNER JOIN Orders AS t2 ON t2.Order_ID = Staff.Order_ID
WHERE Orders.Order_Date BETWEEN  '2011/01/01' AND  '2013/03/01'

替换...为适当的连接条件;这应该使结果看起来像预期的那样。

于 2013-01-07T20:09:52.040 回答