是否可以使用重复的ID进行多对一的JOIN?

问题描述 投票:0回答:2

我有两张桌子,一张是雇员工作许可证,另一张是他们在许可证期间负责的老板,老板桌子有一个与某个雇员相关的独特价值,可以有许多许可证(假期,医疗原因等)。老板表通过员工的唯一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

我已经尝试了外部应用并离开了连接,但是我一直在获取null,其中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.

sql sql-server join
2个回答
0
投票

以下是我对您的问题的理解:

你有一张桌子(让我们称之为老板),其中包含以下信息: - 老板 - 期间 - 员工ID基本上,这张桌子有老板 - 员工关系。

然后你有另一个表(让我们称之为Employee),它有员工信息。现在,根据您发布的示例数据,我假设一个员工可以有多个记录。 (你用相同的ID发布了两次John)。

所以,这就是为什么你加入时你的ID会重复的原因。即使您进行内部联接,ID也会重复。

多对一的关系是可能的。请记住,通常使用主键 - 外键连接创建多对一关系。我会尝试了解Employee表上的主键是什么以及bosses表上的外键是什么。 (请记住,2-3列的组合可以是主键,如果是这种情况,请使用连接中的所有列)一旦您彻底了解了两个表之间的关系,请尝试加入他们,你应该看到预期的结果。

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


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

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

© www.soinside.com 2019 - 2024. All rights reserved.