2015-06-08 76 views
0

我有4個要連接的表。在多個連接中的哪個連接類型

  1. Customers
  2. Traffic
  3. Average
  4. Live

我想插入這些表 「詳細信息」 表中加入數據。 表之間的關係是在這裏: 的每個業務的,平均和動態表有「CID」,即「客戶」表的主鍵:

  • Traffic.cid = Customers.id
  • Average.cid = Customers.id
  • Live.cid = Customers.id

,我寫的查詢是在這裏:

INSERT INTO Details 
(
cid, Customer_Name, Router_Name, 
Traffic_Received, 
Average_Received, 
Live_Received, 
date 
)  
(
SELECT Customers.id AS cid, Customers.name AS Customer_Name, Traffic.Router_Name, 
Traffic.Received, 
Average.Received, 
Live.Received, 
Traffic.date 
FROM Customers 
INNER JOIN Traffic ON Customers.id=Traffic.cid 
INNER JOIN Average ON Customers.id=Average.cid 
INNER JOIN Live ON Customers.id=Live.cid 
WHERE Traffic.date='2015-06-08' 
) 

但結果會有重複的行。我將JOIN更改爲LEFT JOINRIGHT JOIN。但結果沒有改變。 我應該怎麼做才能在Details表中沒有重複行?

+1

select distinct? – jarlh

+0

4個表中的所有數據都是唯一的。鮮明的沒有任何變化。 –

+0

@BayanB。 。 。你說:「但結果會有重複的行。」有沒有或沒有重複?用樣本數據和期望的結果編輯您的問題。更好的是,使用SQL小提琴。 –

回答

0

隨着LEFT JOIN,你將加入到表(例如Traffic),即使沒有對應於Customers.id,在這種情況下,記錄,您將獲得該表中沒有匹配記錄的列的null值。

對於RIGHT JOIN,即使Customers中沒有相應的記錄,您也將從連接表中獲取每條記錄。

但是,JOIN的類型在這裏不是問題。如果您在結果中獲得重複記錄,那麼這意味着您要加入的表中有多個匹配記錄。例如,Traffic中可能有多個記錄,而cid的記錄相同。使用SELECT DISTINCT刪除重複項,或者如果您對這些重複項的彙總感興趣,請使用匯總函數,例如count()sum()GROUP BY子句(例如, GROUP BY Traffic.cid

如果你仍然有重複,然後檢查以確保它們確實是重複的 - 我建議一個或多個列實際上是不同的。

+0

謝謝你的好的和完整的解釋 –

0

能否請您試試這個

 INSERT INTO Details 
    (
     cid, Customer_Name, Router_Name, 
     Traffic_Received, 
     Average_Received, 
     Live_Received, 
     date 
    )  
    (
    SELECT Customers.id AS cid, 
     Customers.name AS Customer_Name, 
     Traffic.Router_Name, 
     Traffic.Received, 
     Average.Received, 
     Live.Received, 
     Traffic.date 
    FROM Customers 
    INNER JOIN Traffic ON Customers.id=Traffic.cid 
    INNER JOIN Average ON Customers.id=Average.cid 
    INNER JOIN Live ON Customers.id=Live.cid 
    WHERE Traffic.date='2015-06-08' 
    GROUP BY 
     cid, 
     Customer_Name, 
     Traffic.Router_Name, 
     Traffic.Received, 
     Average.Received, 
     Live.Received, 
     Traffic.date 
    ) 
+0

爲什麼不保存大量的輸入並改爲SELECT DISTINCT? – jarlh

0
SELECT Customers.id AS cid, Customers.name AS Customer_Name, Traffic.Router_Name, 
Traffic.Received, 
Average.Received, 
Live.Received, 
Traffic.date 
FROM Customers 
LEFT JOIN Traffic ON Customers.id=Traffic.cid 
LEFT JOIN Average ON Traffic.cid=Average.cid 
LEFT JOIN Live ON Average.cid=Live.cid 
WHERE Traffic.date='2015-06-08' 
+0

結果沒有任何區別 –

+0

在這種情況下,您的表格必須在此日期爲每個客戶擁有多個條目。選擇一個客戶,並查看他們每個表中的日期數據。 – CathalMF

+0

細節表每天保存這些數據,並且每個客戶每天只有一個條目。例如,對於2015-06-08,每個客戶的3個表格(交通,實況和平均)都有一個記錄。 –