2013-01-07 102 views
1

以下語句正常工作,但每次顯示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' 

回答

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' 

注:我列名猜對加入

這裏是一個偉大visual explanation of joins,可以幫助學習正確的語法

+0

+1。 。 。這是一個合理的解決方案,是正確的答案。 –

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

實際上,查詢正在進行交叉連接,而不是完整的外部連接。 –

+0

@GordonLinoff謝謝,你說得對。我已更新。 –

2

這是因爲你是從四個表中進行選擇而沒有在它們之間進行任何連接,並且還因爲你兩次加入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' 

更換...適當加入的條件;這應該使結果看起來像預期的那樣。