Возможно ли соединение «один к одному» с дублированными идентификаторами? - PullRequest
0 голосов
/ 18 марта 2019

У меня есть две таблицы, одна для разрешений на работу сотрудников, а другая для боссов, которых они получали за это разрешение, таблицы боссов имеют уникальные значения, связанные с определенным сотрудником, который может иметь много разрешений (отпуск, медицинские причины и т. Д.) , Таблица боссов связана с сотрудниками по уникальному идентификатору сотрудника, а также по дате, когда они были начислены, и по периоду. Я изо всех сил пытаюсь присоединиться к этим таблицам, потому что, очевидно, я не могу установить взаимосвязь «многие к одному» с этими двумя условиями.

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

Я пробовал внешнее применение и оставил соединение, но я получаю нули, где идентификатор повторяется более одного раза , поэтому я получаю что-то вроде:

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 ]

1 голос
/ 18 марта 2019

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

Вы можете изменить запрос, указав фактические имена таблиц и столбцов.

0 голосов
/ 18 марта 2019

Вот мое понимание вашего вопроса:

У вас есть таблица (давайте назовем эту таблицу боссами), которая имеет следующую информацию: - босс - период - идентификатор сотрудника По сути, эта таблица имеет отношения босс-сотрудник.

Тогда у вас есть другая таблица (назовем этого Employee), в которой есть информация о сотруднике. Теперь, исходя из приведенных вами примеров данных, я предполагаю, что для одного сотрудника может быть несколько записей. (Вы отправили Джона дважды с одним и тем же идентификатором).

И вот, поэтому идентификатор повторяется в вашем случае, когда вы присоединяетесь. Даже если вы выполняете внутреннее соединение, идентификатор будет повторяться .

Возможно многозначное отношение. Имейте в виду, что отношения «один к одному» обычно создаются с помощью соединения первичного ключа с внешним ключом. Я хотел бы попытаться понять, что является первичным ключом в таблице Employee и что внешний ключ находится в таблице боссов. (Имейте в виду, комбинация из 2-3 столбцов может быть первичным ключом, и если это так, используйте все эти столбцы в своем объединении) Как только вы получите полное представление о том, как соотносятся две таблицы, попробуйте объединить их, и вы увидите ожидаемые результаты.

Если я не ответил на ваш вопрос, пожалуйста, не стесняйтесь размещать больше данных, и я могу попытаться ответить на них снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...