Операция обновления SQL Server с присоединением
У меня есть данные в таблице загрузки, и я пытаюсь написать инструкцию 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
, как описано в этом сценарии?
Попробуйте это...
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)
- Вопросы
- Sql-server-2012
- Операция обновления SQL Server с присоединением