Sql 是否可能使用重复的ID进行多对一连接?
我有两个表,一个是员工工作许可证,另一个是他们在许可证期间负责的老板,老板表有与某个员工相关的唯一值,该员工可以有许多许可证(假期、医疗原因等)。Boss表通过员工的唯一id以及他们的任职日期和期间与员工相关。我很难加入这些表格,因为显然我不能在这两种情况下建立多对一的关系Sql 是否可能使用重复的ID进行多对一连接?,sql,sql-server,join,Sql,Sql Server,Join,我有两个表,一个是员工工作许可证,另一个是他们在许可证期间负责的老板,老板表有与某个员工相关的唯一值,该员工可以有许多许可证(假期、医疗原因等)。Boss表通过员工的唯一id以及他们的任职日期和期间与员工相关。我很难加入这些表格,因为显然我不能在这两种情况下建立多对一的关系 idemp convert() nameemp ----------------- 1 201801 john 1 201801 john 2 201802 jane idemp period na
idemp convert() nameemp
-----------------
1 201801 john
1 201801 john
2 201802 jane
idemp period nameboss
------------------
1 201801 orange
2 201802 pink
3 201802 brown
我要找的是:
idemp convert() nameemp nameboss
-----------------------------
1 201801 john orange
1 201801 john orange
2 201802 jane pink
我尝试了外部应用和左连接,但在id重复多次的情况下,我不断得到空值,因此我得到如下结果:
idemp convert() nameemp nameboss
-----------------------------
1 201801 john orange
1 201801 john NULL
2 201802 jane pink
我的代码尝试
外部应用:
SELECT t.idemp, t.period, t.nameemp, d.nameboss
FROM dbo.employeePermit AS T
outer apply (select top (1) d.* from bossDot d where D.period= CONVERT(nvarchar(6), T.ORIGINAL_INI, 112) AND D.IDemp = T.IDemp order by d.period asc) d;
--One of the variables are converted in order to join with the period
左外连接:
SELECT t.idemp, t.period, t.nameemp, d.nameboss
FROM dbo.employeePermit AS T LEFT OUTER JOIN
dbo.bossDot AS D ON D.period= CONVERT(nvarchar(6), T.ORIGINAL_INI, 112) AND D.IDemp = T.IDemp
--One of the variables are converted in order to join with the period
我甚至不知道我是否在正确的轨道上,所以任何关于查询或方法的帮助都是非常感谢的
A
LEFT JOIN
适用于您的情况。请使用示例数据查找查询:
DECLARE @WorkPermits TABLE (idemp INT, [period] VARCHAR(6), nameemp VARCHAR (10));
INSERT INTO @WorkPermits (idemp, [period], nameemp) VALUES
(1, '201801', 'john'),
(1, '201801', 'john'),
(2, '201802', 'jane');
DECLARE @Bosses TABLE (idemp INT, [period] VARCHAR(6), nameboss VARCHAR (10));
INSERT INTO @Bosses (idemp, [period], nameboss) VALUES
(1, '201801', 'orange'),
(2, '201802', 'pink'),
(3, '201802', 'brown');
SELECT W.idemp, W.period, W.nameemp, B.nameboss
FROM @WorkPermits AS W
LEFT JOIN @Bosses AS B ON B.idemp = W.idemp;
输出:
idemp period nameemp nameboss
---------------------------------
1 201801 john orange
1 201801 john orange
2 201802 jane pink
您可以使用实际的表名和列名修改查询。以下是我对您的问题的理解: 您有一个表(我们称之为表BOSS),其中包含以下信息: -老板 -时期 -员工ID 从本质上说,此表具有“老板-员工”关系 然后您有另一个表(我们称之为Employee),其中包含员工信息。现在,根据您发布的示例数据,我假设一个员工可以有多个记录。(您已使用相同的ID两次发布John) 因此,这就是为什么在您加入时,ID会在您的案例中重复。即使进行内部联接,ID也会重复 多对一关系是可能的。请记住,多对一关系通常是使用主键外键联接创建的。我会尝试理解Employee表上的主键是什么,Boss表上的外键是什么。(请记住,2-3列的组合可以是主键,如果是这种情况,请在联接中使用所有这些列) 一旦您彻底了解了这两个表之间的关系,尝试将它们连接起来,您就会看到预期的结果
如果我还没有回答你的问题,请随时发布更多数据,我可以再次尝试回答 您发布的查询与示例中的列不匹配。请发布与您的问题相关的示例数据。更正了它,查询太长了,我只是剪切了其中的大部分,以使其在帖子中看起来更清晰。对不起@SeanLange@Ali . . . 你的查询应该可以。我添加了一张图片,伙计们,检查id是否相同,但数据填充不正确@gordonlinoff你实际上更清楚我的想法,我没有关系,因为我处理的许多表在生成报告后被删除。谢谢,欢迎!。很高兴我能帮上忙:-)Good Lucka在员工ID上建立了关系,再次加入了两个表,我的结果显示正确,谢谢。谢谢,但是LEFT JOIN也不起作用(我在帖子上上传了一张新图片)。