我正在尝试使用左表连接在下表中加入两个表
帐户表
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时,它很好。
我是否知道获得预期结果的更好方法?
答案 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。