显示4x记录的SQL查询

问题描述:

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

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' 

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

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' 

注:我列名猜对加入

这里是一个伟大visual explanation of joins,可以帮助学习正确的语法

+0

+1。 。 。这是一个合理的解决方案,是正确的答案。 –

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' 
+1

实际上,查询正在进行交叉连接,而不是完整的外部连接。 –

+0

@GordonLinoff谢谢,你说得对。我已更新。 –

这是因为你是从四个表中进行选择而没有在它们之间进行任何连接,并且还因为你两次加入Orders。结果,制造了笛卡尔产品

这里是你应该如何解决:重新编写theta连接使用ANSI语法,并提供适当的连接条件:

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' 

更换...适当加入的条件;这应该使结果看起来像预期的那样。