Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server update语句与join_Sql_Sql Server_Sql Server 2008_Tsql_Sql Server 2012 - Fatal编程技术网

SQL Server update语句与join

SQL Server update语句与join,sql,sql-server,sql-server-2008,tsql,sql-server-2012,Sql,Sql Server,Sql Server 2008,Tsql,Sql Server 2012,我在一个load表中有数据,我正试图编写一个update语句来填充一个额外的自引用表,但在使用确切的语法时遇到了困难 以下是两个表格布局和附带数据的简化示例: CREATE TABLE tmpLoad ( PositionNumber VARCHAR(2), SupervisorNumber VARCHAR(2) ) INSERT INTO tmpLoad VALUES ('01', '00') INSERT INTO tmpLoad VALUES ('02', '

我在一个load表中有数据,我正试图编写一个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
中的数据表示五名员工,使用他们的
职位编号
作为唯一标识符,以及他们各自的主管

  • 员工01是老板(
    主管编号
    ==0)
  • 员工02和03向员工01报告
  • 04和05号员工向03号员工报告
tmposition
表是自引用的,其中
PositionID
可以位于许多其他记录的
SupervisorID
列中

如您所见,
SupervisorID
列当前对于所有记录都为空。我试图通过将这两个表连接在一起,用适当的
PositionID
填充它

为了验证我的想法,我运行了以下
SELECT
query:

 SELECT a.PositionNumber,
        a.SupervisorNumber,
        b.PositionID,
        b.PositionNumber,
        b.SupervisorID
 FROM tmpLoad a
      JOIN tmpPosition b 
      ON a.SupervisorNumber = b.PositionNumber
UPDATE tmpPosition
SET SupervisorID = b.PositionID
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
列中的值:

 SELECT a.PositionNumber,
        a.SupervisorNumber,
        b.PositionID,
        b.PositionNumber,
        b.SupervisorID
 FROM tmpLoad a
      JOIN tmpPosition b 
      ON a.SupervisorNumber = b.PositionNumber
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
这里发生了什么?我如何使用本场景中描述的
位置ID
填充
监管ID
字段?

试试这个

UPDATE tmpPosition
SET SupervisorID = tL.SupervisorNumber
FROM tmpPosition tp   
JOIN tmpLoad tl ON tp.PositionNumber = CONVERT(INT,tl.PositionNumber) 
这将给出您在此模式中想要的内容。 我仍然认为这不是一个好的DB设计

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)

tmpload中没有主管编号为02、04、05的行,因此来自tmpposition的行不会加入任何一个查询。您的加入是否应该在
a.positionnumber=b.positionnumber
上?“因此,我假设在运行以下更新查询时,SupervisorID列将填充这四条记录的PositionID列中的值:“这是你的问题。结果中的SupervisorID列实际上只表示TMPosition表的两行。通过检查结果中的PositionNumber,您可以看到:对于PositionNumber 01和03,TMPositionTable中只有两行—每个行两行—因此,如果您将其转换为更新查询,则如果您将PositionNumber用作唯一标识符,它只会更新PositionNumber 01和03的行(每个行两行,值相同!),你为什么不把它列为一个呢<代码>创建表tmposition(PositionID uniqueIdentifier,…然后您不需要为其插入任何值,它将自动插入。