【发布时间】:2014-07-31 22:03:21
【问题描述】:
我在加载表中有数据,我正在尝试编写一个更新语句来填充一个额外的自引用表,但在使用确切的语法时遇到了困难。
这是两个表格布局和随附数据的简化示例:
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
据此,我假设当我运行以下 UPDATE 查询时,SupervisorID 列将填充这四个记录的 PositionID 列中的值:
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
这里发生了什么以及如何使用PositionID 填充SupervisorID 字段,如本方案中所述?
【问题讨论】:
-
tmpload 中没有主管编号为 02,04,05 的任何行,因此来自 tmpposition 的那些行不会加入任何查询。
-
不应该加入
a.positionnumber = b.positionnumber吗? -
“据此,我假设在我运行以下 UPDATE 查询时,SupervisorID 列将填充这四条记录的 PositionID 列中的值:”这是你的问题。结果中的 SupervisorID 列实际上只代表 tmpPosition 表的两行。您可以通过检查结果中的 PositionNumber 来看到这一点:您只有 tmpPosition 表中 positionNumbers 01 和 03 的行——每行两个——所以如果你把它变成一个更新查询,它只会更新位置的行01 和 03(每个两次,具有相同的值!)
-
如果您使用位置作为唯一标识符,为什么不将其声明为一个?
CREATE TABLE tmpPosition (PositionID uniqueIdentifier, ...那你就不用给它插入任何值了,它会自动插入的。
标签: sql sql-server sql-server-2008 tsql sql-server-2012