Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否可能使用重复的ID进行多对一连接?_Sql_Sql Server_Join - Fatal编程技术网

Sql 是否可能使用重复的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

我有两个表,一个是员工工作许可证,另一个是他们在许可证期间负责的老板,老板表有与某个员工相关的唯一值,该员工可以有许多许可证(假期、医疗原因等)。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
我甚至不知道我是否在正确的轨道上,所以任何关于查询或方法的帮助都是非常感谢的


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也不起作用(我在帖子上上传了一张新图片)。