有可能使用重复的ID进行多对一的JOIN吗?

时间:2019-03-18 13:37:53

标签: sql sql-server join

我有两个表,一个表用于雇员的工作许可,另一个表用于在该许可期间负责的上司,boss表具有与某个雇员相关的唯一值,该雇员可以获得许多许可证(休假,医疗原因等) 。老板表通过员工的唯一ID,上班日期和期间与员工相关。我正在努力加入这些表,因为显然我无法对这两个条件进行多对一的关系。

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

我什至不知道自己是否处在正确的轨道上,因此希望对查询或方法提供任何帮助。

Here's how it actually shows results.

2 个答案:

答案 0 :(得分:1)

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

您可以使用实际的表名和列名来修改查询。

答案 1 :(得分:0)

这是我对您问题的理解:

您有一个表(我们称此表为老板),其中包含以下信息: -老板 -期间 - 员工ID 本质上,此表具有老板与雇员的关系。

然后,您将拥有另一个包含员工信息的表(我们称为Employee)。现在,根据您发布的样本数据,我假设一个雇员可以有多个记录。 (您用相同的ID向John发布了两次)。

因此,这就是为什么您加入时ID重复的情况。即使您进行内部联接, ID也会重复

许多关系是可能的。请记住,通常使用主键-外键联接来创建多对一关系。我将尝试了解Employee表上的主键是什么,boss表上的外键是什么。 (请记住,可以将2-3列的组合作为主键,如果是这种情况,请在联接中使用所有这些列) 一旦完全了解了两个表之间的关系是如何进行的,请尝试将它们连接起来,您将看到预期的结果。

如果我没有回答您的问题,请随时发布更多数据,我可以尝试再次回答。