Операция обновления SQL Server с присоединением

89
6

У меня есть данные в таблице загрузки, и я пытаюсь написать инструкцию update для заполнения дополнительной таблицы саморегуляции, но у меня возникают трудности с точным синтаксисом.


Вот упрощенный пример двух табличных макетов и сопутствующих данных:


CREATE TABLE tmpLoad (
PositionNumber VARCHAR(2),
SupervisorNumber VARCHAR(2)
)

INSERT INTO tmpLoad VALUES ('01', '00')
INSERT INTO tmpLoad VALUES ('02', '01')
INSERT INTO tmpLoad VALUES ('03', '01')
INSERT INTO tmpLoad VALUES ('04', '03')
INSERT INTO tmpLoad VALUES ('05', '03')

CREATE TABLE tmpPosition (
PositionID int,
PositionNumber VARCHAR(2),
SupervisorID int
)

INSERT INTO tmpPosition VALUES (1, '01', null)
INSERT INTO tmpPosition VALUES (2, '02', null)
INSERT INTO tmpPosition VALUES (3, '03', null)
INSERT INTO tmpPosition VALUES (4, '04', null)
INSERT INTO tmpPosition VALUES (5, '05', null)


Данные в tmpLoad представляют пять сотрудников, используя их PositionNumber как уникальный идентификатор и их соответствующие супервизоры.


    Сотрудник 01 - босс (SupervisorNumber == 0)
    Сотрудники 02 и 03 сообщают сотруднику 01
    Сотрудники 04 и 05 сообщают сотруднику 03

Таблица tmpPosition является саморегуляцией, где PositionID может быть во многих других записях SupervisorID.


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


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


 SELECT a.PositionNumber,
a.SupervisorNumber,
b.PositionID,
b.PositionNumber,
b.SupervisorID
FROM tmpLoad a
JOIN tmpPosition b
ON a.SupervisorNumber = b.PositionNumber

Который, по моему мнению, дал желаемые результаты:


PositionNumber--SupervisorNumber--PositionID--PositionNumber--SupervisorID
02--------------01----------------1-----------01--------------NULL
03--------------01----------------1-----------01--------------NULL
04--------------03----------------3-----------03--------------NULL
05--------------03----------------3-----------03--------------NULL

Из этого я предположил, что столбец SupervisorID будет заполнен значением из столбца PositionID для этих четырех записей, когда я выполнил следующий запрос UPDATE:


UPDATE tmpPosition
SET SupervisorID = b.PositionID
FROM tmpLoad a
JOIN tmpPosition b
ON a.SupervisorNumber = b.PositionNumber

Однако после выполнения запроса результаты не были такими, какие я ожидал:


SELECT *
FROM tmpPosition

PositionID--PositionNumber--SupervisorID
1-----------01--------------1
2-----------02--------------NULL
3-----------03--------------3
4-----------04--------------NULL
5-----------05--------------NULL


Идеальные результаты:


PositionID--PositionNumber--SupervisorID
1-----------01--------------NULL
2-----------02--------------1
3-----------03--------------1
4-----------04--------------3
5-----------05--------------3

Что здесь происходит и как я могу заполнить поле SupervisorID с помощью PositionID, как описано в этом сценарии?

спросил(а) 2021-01-19T19:09:39+03:00 6 месяцев, 1 неделя назад
1
Решение
64

Попробуйте это...


UPDATE tmpPosition
SET SupervisorID = tL.SupervisorNumber
FROM tmpPosition tp
JOIN tmpLoad tl ON tp.PositionNumber = CONVERT(INT,tl.PositionNumber)

Это даст именно то, что вы хотите в этой схеме.
Тем не менее, я не думаю, что это хороший дизайн БД.


UPDATE tmpPosition 
SET SupervisorID = CASE WHEN tl.SupervisorNumber = 0
THEN NULL
ELSE tl.SupervisorNumber
END
FROM tmpPosition tp
JOIN tmpLoad tl ON tp.PositionNumber = CONVERT(INT,tl.PositionNumber)

ответил(а) 2021-01-19T19:09:39+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема