当两个表之间匹配且匹配不为空时,左连接返回重复行

时间:2015-11-03 20:10:06

标签: sql-server join left-join

我正在尝试使用左表连接在下表中加入两个表

帐户表

Zone   ACC_NUM   Profile Status 
INT    123456    11      Active
DOM    246810    12      Active
INT    135791    12      Inactive

米表

Acc_Num  Meter
123456   156894
135791   NULL

预期结果

   Zone   ACC_NUM   Profile  Status    Meter
    INT    123456    11      Active    156894
    DOM    246810    12      Active    NULL
    INT    135791    12      Inactive  NULL

我编写了以下查询,但是我看到了一些重复项,例如以下查询后面的结果

Select a.Zone, a.Acc_Num, a.Status, m.Meter 
From Account a
left join Meter m on m.Acc_Num=a.Acc_Num

我得到了以下不可取的结果

    Zone   ACC_NUM   Profile  Status    Meter
    INT    123456    11      Active    NULL
    INT    123456    11      Active    156894     
    DOM    246810    12      Active    NULL
    INT    135791    12      Inactive  NULL

从上面的结果中,我发现当两个表格之间存在匹配且表格为not null时,它返回重复行,一个带有NULL meter,另一个带有实际值,看起来像是'当没有匹配或匹配但是米是NULL时,它很好。

我是否知道获得预期结果的更好方法?

2 个答案:

答案 0 :(得分:2)

您的代码完全有效:

CREATE TABLE #Account(
   Zone    VARCHAR(30) NOT NULL 
  ,ACC_NUM INTEGER  NOT NULL
  ,Profile INTEGER  NOT NULL
  ,Status  VARCHAR(80) NOT NULL
);
INSERT INTO #Account(Zone,ACC_NUM,Profile,Status) VALUES ('INT',123456,11,'Active');
INSERT INTO #Account(Zone,ACC_NUM,Profile,Status) VALUES ('DOM',246810,12,'Active');
INSERT INTO #Account(Zone,ACC_NUM,Profile,Status) VALUES ('INT',135791,12,'Inactive');


CREATE TABLE #Meter(
   Acc_Num INTEGER  NOT NULL 
  ,Meter   VARCHAR(60) 
);
INSERT INTO #Meter(Acc_Num,Meter) VALUES (123456,'156894');
INSERT INTO #Meter(Acc_Num,Meter) VALUES (135791,NULL);


Select a.Zone, a.Acc_Num, a.Status, m.Meter 
From #Account a
left join #Meter m on m.Acc_Num=a.Acc_Num;

LiveDemo

问题可能是Meter表中的数据。我猜你还有123456 NULL值的额外行。

如果每组只需要一个值,则可以使用:

Select a.Zone, a.Acc_Num, a.Status, m.Meter 
From #Account a 
left join (SELECT Acc_Num, MIN(Meter) AS Meter 
           FROM #Meter 
           GROUP BY Acc_Num) AS m on m.Acc_Num=a.Acc_Num

LiveDemo2

答案 1 :(得分:1)

您的查询是关于最好的方法。但是,要回答你的问题我是如何处理的,如果有一个NULL来获得预期的结果?,只需在你的连接条件中添加一个NULL检查:

Select a.Zone, a.Acc_Num, a.Status, m.Meter 
From #Account a
left join #Meter m on NOT m.Meter IS NULL AND m.Acc_Num = a.Acc_Num;

这是fiddle