如何在没有主键或唯一键的情况下连接两个表?

时间:2014-06-13 16:39:51

标签: mysql sql sql-server join

我有两个名为LocalVSDB和TemporaryVSDB的表。两个表都具有相同的列:

  LocalVSDB: msisdn,activateDate
  TemporaryVSDB: msisdn,activateDate

但是这两个表也有MSIDSN的重复行

我需要加入这两个表。我的预期结果如下:

    MSISDN     LocalActivateDate    TemporaryActivateDate Datediff
  60103820251    2013-12-14          2013-10-05              70
  601111000254   2013-12-14          2013-10-05              70
  601111000254   2013-12-18          2013-09-10              80

但是,由于存在重复的MSIDSN,我加入时会出现重复的行。例如,每个表中某些MSISDN有6行,所以当我加入时,我得到的MSISDN共有36行。

我正在使用以下查询加入:

   SELECT t.msisdn,t.activateDate AS VSDB_Activate_Date,
          l.activateDate AS Local_Activate_Date,
          DATEDIFF(D,l.activateDate,t.activateDate) AS date_Diff
   FROM temporaryVSDB2  t
   INNER JOIN LocalVSDB  l ON t.msisdn = l.msisdn
   WHERE  t.activateDate >  l.activateDate

请帮助我如何获得6行6个MSISDN?

提前致谢。

3 个答案:

答案 0 :(得分:1)

问题是:

where  t.activateDate >  l.activateDate

这意味着表1中的一行可以连接到表2中的所有六行。您需要将此更改为=或根据特定条件从第二个表中获取单行。

答案 1 :(得分:1)

SELECT m.MSIDN, m.ActiveDate, t.ActiveDate, DATEDIFF(DAY, m.ActiveDate, t.ActiveDate) Duration
FROM LocalVSDB m
OUTER APPLY
(
    SELECT TOP 1 d.MSIDN, d.ActiveDate
    FROM TemporaryVSDB d
    WHERE d.ActiveDate > m.ActiveDate
    ORDER BY d.ActiveDate
) t

这会找到最近的合作伙伴记录和持续时间(最后一条记录将有一个空的合作伙伴)

答案 2 :(得分:0)

您可以使用自己的查询添加group by子句,前提是msidn和activateDate会生成唯一的行。

    SELECT t.msisdn,t.activateDate AS VSDB_Activate_Date,
    l.activateDate AS Local_Activate_Date,
    DATEDIFF(D,l.activateDate,t.activateDate) AS date_Diff
    FROM temporaryVSDB2  t INNER JOIN LocalVSDB  l ON t.msisdn = l.msisdn
    WHERE  t.activateDate >  l.activateDate
    group by t.msisdn, t.activateDate