【发布时间】:2013-12-11 00:34:17
【问题描述】:
这是一个基本的左连接问题,我已经阅读了许多解释发生了什么的文章,但不知何故,解决方案并没有在我的脑海中点击。我的左表有唯一的记录。我的右表对于左侧的每条记录都有几条记录。
在我一直在阅读的文章中,这通常被解释为左表有客户,右表有订单。这非常相似,但不完全是我所面临的。
在我的情况下,左表有唯一记录,而右表有重复数据要迁移到左表所在的数据库中。所以我正在尝试编写一个查询,该查询将加入两者共享的键,但我只需要右起一张记录。我得到的结果当然有多个记录,因为单个左侧匹配右侧多次。
我想我需要添加某种过滤,例如 Top(1),但仍在阅读/学习,并希望从这个列表中的聪明人那里获得反馈/方向。
这是我正在使用的简单架构:
DECLARE @Customer TABLE
(
Id int,
Name varchar(50),
email varchar(50)
)
INSERT @Customer VALUES(1, 'Frodo', 'frodo@middleearth.org')
INSERT @Customer VALUES(2, 'Bilbo', 'Bilbo@middleearth.org')
INSERT @Customer VALUES(3, 'Galadriel', 'Galadriel@middleearth.org')
INSERT @Customer VALUES(4, 'Arwen', 'Arwen@middleearth.org')
INSERT @Customer VALUES(5, 'Gandalf', 'Gandalf@middleearth.org')
DECLARE @CustomerJobs TABLE
(
Id int,
email varchar(50),
jobname varchar(50)
)
INSERT @CustomerJobs VALUES(1, 'frodo@middleearth.org', 'RingBearer')
INSERT @CustomerJobs VALUES(2, 'frodo@middleearth.org', 'RingBearer')
INSERT @CustomerJobs VALUES(3, 'frodo@middleearth.org', 'RingBearer')
INSERT @CustomerJobs VALUES(4, 'frodo@middleearth.org', 'RingBearer')
INSERT @CustomerJobs VALUES(5, 'frodo@middleearth.org', 'RingBearer')
INSERT @CustomerJobs VALUES(6, 'Bilbo@middleearth.org', 'Burglar')
INSERT @CustomerJobs VALUES(7, 'Bilbo@middleearth.org', 'Burglar')
INSERT @CustomerJobs VALUES(8, 'Bilbo@middleearth.org', 'Burglar')
INSERT @CustomerJobs VALUES(9, 'Galadriel@middleearth.org', 'MindReader')
INSERT @CustomerJobs VALUES(10, 'Arwen@middleearth.org', 'Evenstar')
INSERT @CustomerJobs VALUES(10, 'Arwen@middleearth.org', 'Evenstar')
INSERT @CustomerJobs VALUES(11, 'Gandalf@middleearth.org', 'WhiteWizard')
INSERT @CustomerJobs VALUES(12, 'Gandalf@middleearth.org', 'WhiteWizard')
SELECT
Cust.Name,
Cust.email,
CJobs.jobname
FROM
@Customer Cust
LEFT JOIN @CustomerJobs CJobs ON
Cjobs.email = Cust.email
我正在玩弄 row_number over partition(),因为也许我应该加入一个带有 row_number over partition 而不是表本身的 cte ???
我的另一个限制是我无法从右表中删除重复项。
对于这个过于简单化的问题,我再次表示歉意,并感谢您的帮助。
【问题讨论】:
-
只需要右边的一条记录是什么意思?哪个记录?还是您只关心具有 ANY 记录的正确表而不关心哪条记录?在您的示例中,它们始终是同一个人的相同记录;您的所有数据都是这种情况吗?
-
我只需要将作业名添加到左侧数据库中,由于右侧重复,我不在乎它使用哪个记录,我只想要一次。
标签: sql-server tsql left-join