当两个表之间存在匹配且匹配不为空时,左连接返回重复行
Left join returning duplicate rows when there is match between two tables and match is not null
我正在尝试在 table 之后使用左连接来连接两个 table
帐号Table
Zone ACC_NUM Profile Status
INT 123456 11 Active
DOM 246810 12 Active
INT 135791 12 Inactive
仪表Table
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
从上面的结果中,我发现当 tables 和 meter 都匹配时 not null
它返回了重复的行,一个是 NULL meter
另一个是实际值当没有匹配项或有匹配项但 meter 为 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;
问题可能是您在 Meter
table 中的数据。我猜你还有 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
您的查询是关于最好的方法。但是,要回答您的问题 如果万一有 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.
我正在尝试在 table 之后使用左连接来连接两个 table
帐号Table
Zone ACC_NUM Profile Status
INT 123456 11 Active
DOM 246810 12 Active
INT 135791 12 Inactive
仪表Table
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
从上面的结果中,我发现当 tables 和 meter 都匹配时 not null
它返回了重复的行,一个是 NULL meter
另一个是实际值当没有匹配项或有匹配项但 meter 为 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;
问题可能是您在 Meter
table 中的数据。我猜你还有 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
您的查询是关于最好的方法。但是,要回答您的问题 如果万一有 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.