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

2022-02-28 00:00:00 join left-join sql-server

我正在尝试对以下表使用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

从上面的结果中我发现,当两个表之间都有匹配时,meeter isnot null返回重复的行,一个有NULL meter,另一个有实际值,当没有匹配时或者当存在匹配但meeter为NULL时看起来很好。

我可以知道获得预期结果的更好方法吗?


解决方案

您的代码完全有效:

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

相关文章