在SQL Server中,与右非重复表的左联接返回更多行

9lowa7mx  于 2023-01-25  发布在  SQL Server
关注(0)|答案(2)|浏览(136)

我有两个表,一个是Main表,另一个是Mapping表,简化后的表如下所示:
主要:

VALUE | CUSTNAME
123 | ADELE
323 | GORTH
242 | GORTH
345 | VIX
...

Map:

ISSUER | CATEGORY 
ADELE | A
GORTH | B
DENN | B
VIX | C
...

我想做的是在我的Main表中添加一个CATEGORY列,所以我想使用一个左连接,但是不知怎么的,它返回的行数比我原来的要多,而且我不能一个接一个地检查它,因为它有大约30000条记录,它本身的增加是很小的,40条记录,但是它仍然是一个区别,而且它显示了出来。
注意事项和我已经尝试过的事项:

  • Main表可以保存相同的CUSTNAME,而Mapping表是不同的,使其成为多对一关系。
  • Mapping表包含重复记录,因此我尝试在连接它之前先选择不同的记录
  • 我已经检查了NULL,以查看Mapping表是否遗漏了任何内容,但似乎不是这样
  • 我同时使用了内连接和左连接,但返回的结果相同

我到底做错了什么,我该怎么做?
我的疑问:

SELECT A.*, B.CATEGORY AS CATEGORY
FROM Main A
LEFT JOIN 
    (SELECT DISTINCT * FROM Mapping) B ON A.CUSTNAME = B.Issuer

我现在的输出:

VALUE | CUSTNAME | CATEGORY
    123 | ADELE | A
    323 | GORTH | B
    242 | GORTH | B
    345 | VIX | C
    ... with extra 40 records

我的预期输出:

VALUE | CUSTNAME | CATEGORY
    123 | ADELE | A
    323 | GORTH | B
    242 | GORTH | B
    345 | VIX | C
    ... without extra 40 records
sr4lhrrt

sr4lhrrt1#

如果您希望消除重复的Mapping.Issuer ONLY,可以按以下步骤操作。

SELECT A.*, B.CATEGORY AS CATEGORY
FROM Main A
LEFT JOIN 
    (SELECT Issuer, MAX(CATEGORY) AS CATEGORY FROM Mapping group by Issuer) B ON A.CUSTNAME = B.Issuer

您可能在Map表中有如下数据:

insert into Mapping values 
('ADELE','A'),
('GORTH','B'),
('DENN','B'),
('VIX','C'),
('VIX','D');

这意味着('VIX','C'), ('VIX','D')不是重复项
demo here

lrpiutwd

lrpiutwd2#

这一点:

SELECT DISTINCT * FROM Mapping

Distinct *表示ALL列的元组(组合)将被视为唯一;但是,如果有两行具有相同的Issuer,但其他列的 * any * 中的值不同,它仍然会返回多行。

Issuer | ManufactureId 
5623     894 
5623     895

这反过来又会使A中的一行变成left join中的多行。

相关问题