我有一个加载表中的数据,我正在尝试编写一个更新语句来填充一个额外的自引用表,但是我的语法确实很难。
以下是两个表格布局和附带数据的简化示例:
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
作为唯一标识符,以及他们各自的主管。
SupervisorNumber
== 0) 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
字段?
答案 0 :(得分:1)
试试这个......
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)