SQL Присоединяйтесь к Лайв Оператору - PullRequest
0 голосов
/ 25 марта 2020

Я знаю, что этот вопрос задавался пару раз, и я пытался использовать решение для моей проблемы. К сожалению, я не получил желаемого результата. Мне нужно обновить столбец идентификатора в одной таблице, соединив его с другой таблицей, где объединяющий столбец не имеет точного значения.

TableA                                               TableB
EmpNo   EmpName      ID                              EmpNo          EmpName        ID    TermDate
101     John Doe     Null                            250termed_101  John Doe       250   11-15-2018
102     Jane Doe     Null                            251termed_102  Jane Doe       251   02-25-2019
101     Bryan Adams  Null                            252termed_101   Bryan Adams   252   03-12-2020

Вот что я пытался, но не смог получить требуемый вывод, потому что следующий запрос дает мне дубликаты:

select *
from TableA as A left join
     TableB as B
     on B.EmpNo like '%' + A.EmpNo + '%' and A.EmpNo is not null

Требуется вывод:

EmpNo   EmpName      ID
101     John Doe     250
102     Jane Doe     251
101     Bryan Adams  252

Мне нужно заполнить столбец ID из TableB в TableA, соединив эти 2 таблицы в EmpNo. Для первой записи Джон Доу уволен 11-15-2018, и его номер сотрудника назначен Брайану Адамсу с уникальным идентификатором. Мне нужно заполнить столбец ID из таблицы B в таблицу A для соответствующего сотрудника, у которого был этот номер в то время.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Если ваша проблема действительно в том, что вы получаете дубликаты, которые вам не нужны, вы можете добавить DISTINCT. Но ваша проблема в данных: Брайан Адамс и Джон Доу имеют номера сотрудников 101, поэтому они выглядят дублированными, когда вы присоединяетесь к TableB.

Эта SQL скрипка может вам помочь: http://sqlfiddle.com/#! 18 / f30476 / 10

0 голосов
/ 25 марта 2020

Вы, кажется, на правильном пути, оператор обновления должен выглядеть следующим образом, также обратите внимание, как я делаю подобное сравнение более точным:

update A SET
    ID = B.ID
from 
    TableA as A 
    left join TableB as B on 
        B.EmpNo like '%_' + A.EmpNo and 
        A.EmpNo is not null;

, которое сломается, когда у вас есть 101 и 1101 или 2101, так что это не очень хорошее совпадение, поэтому давайте вернемся:

update A SET
        ID = B.ID
    from 
        TableA as A 
        inner join TableB as B on 
            RIGHT(B.EmpNo, len(B.EmpNo) - charindex('_', B.EmpNo)) = A.EmpNo
            A.EmpNo is not null and --you don't need this, 
            charindex('_', B.EmpNo) > 0;--needed, otherwise you get string errors
...