带连接的SQL Server更新语句

时间:2014-07-31 22:03:21

标签: sql sql-server sql-server-2008 tsql sql-server-2012

我有一个加载表中的数据,我正在尝试编写一个更新语句来填充一个额外的自引用表,但是我的语法确实很难。

以下是两个表格布局和附带数据的简化示例:

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字段?

1 个答案:

答案 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)