当两个表之间存在匹配并且匹配不为空时,左连接返回重复行 [英] Left join returning duplicate rows when there is match between two tables and match is not null

查看:93
本文介绍了当两个表之间存在匹配并且匹配不为空时,左连接返回重复行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

这篇关于当两个表之间存在匹配并且匹配不为空时,左连接返回重复行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆