2015-06-08 39 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个表格(交通,实况和平均)都有一个记录。 –