T-SQL Update Record需要添加需要JOIN的条件

时间:2016-07-25 14:53:31

标签: sql-server tsql join

我有一个现有查询,它将表中所有记录的特定值(此处表示为Col1,Col2,Col3)更新为该表中已定义源记录的Cols的当前值。此源记录由Id表示,该ID是此表中的外键(此处表示为FKRecId)

DECLARE @SourceRecordId VARCHAR(50)
SET @SourceRecordId= N'{the Id}'

UPDATE dbo.TargetTable
   SET [Col1] = SourceData.Col1
      ,[Col2] = SourceData.Col2
      ,[Col3] = SourceData.Col3
     FROM ( SELECT Col1, Col2, Col3 FROM TargetTable WHERE FKRecId = @SourceRecordId ) SourceData
WHERE ((FKRecId != @SourceRecordId) AND 
(CAST(TargetTable.Col1 AS NVARCHAR(MAX)) != CAST(SourceData.Col1 AS NVARCHAR(MAX)) OR 
CAST(TargetTable.Col2 AS NVARCHAR(MAX)) != CAST(SourceData.Col2 AS NVARCHAR(MAX)) OR 
CAST(TargetTable.Col3 AS NVARCHAR(MAX)) != CAST(SourceData.Col3 AS NVARCHAR(MAX)) )

GO

这当前使用源记录中定义的值更新表中的所有其他记录。但是,我现在需要添加一个进一步的条件,它只更新那些它们相同的记录" type"作为源记录。 " Type"的值保存在另一个表中 - (该表条目的主键是上面提到的外键ID)。

我试图修改查询以包含JOIN,但我的T-SQL经验有限,并且一直在努力使语法正确。我试图更新的部分如下所示

     FROM ( SELECT Col1, Col2, Col3 FROM TargetTable WHERE FKRecId = @SourceRecordId ) SourceData
JOIN dbo.OtherTable t On t.PrimaryKey = TargetTable.FKRecId
WHERE ((FKRecId != @SourceRecordId) AND (t.Type = KnownType) AND

这会导致JOIN语句的TargetTable元素的SQL Server查询编辑器出错。如果我只是输入列名,则智能感知错误显示为"Invalid column name",如果我使用表名限定它,它就变为"the multi part identifier xxx could not be bound"

任何有关我的语法出错的帮助都将不胜感激,如果有人能指出我的在线参考资源,并提供超出基础知识的T-SQL语句示例,我们也会感激不尽。我可能会在这里找到答案。

感谢。

2 个答案:

答案 0 :(得分:1)

你应该使用这样的UPDATE语句:

DECLARE @SourceRecordId VARCHAR(50)
SET @SourceRecordId= N'{the Id}'

UPDATE U
SET U.[Col1] = SourceData.Col1
   ,U.[Col2] = SourceData.Col2
   ,U.[Col3] = SourceData.Col3
FROM dbo.TargetTable U
     INNER JOIN dbo.OtherTable T ON T.PrimaryKey=U.FKRecId AND T.Type=KnownType
     INNER JOIN dbo.TargetTable SourceData ON SourceData.FKRecId=@SourceRecordId
WHERE U.FKRecId!=@SourceRecordId AND 
      (CAST(U.Col1 AS NVARCHAR(MAX)) != CAST(SourceData.Col1 AS NVARCHAR(MAX)) OR 
       CAST(U.Col2 AS NVARCHAR(MAX)) != CAST(SourceData.Col2 AS NVARCHAR(MAX)) OR 
       CAST(U.Col3 AS NVARCHAR(MAX)) != CAST(SourceData.Col3 AS NVARCHAR(MAX)) )

基本上,FROM和WHERE子句与SELECT语句相同。在UPDATE语句的第一行中,您需要提及要更新的表的别名,并在SET部分中指定等号左侧的别名列。

如果Col1,Col2和Col3列可以为空,那么你必须注意比较在NULL的情况下才能正常工作。

答案 1 :(得分:0)

您尚未从FKRecId子查询返回SourceData列并尝试使用TargetTable访问该列,而您已为该子查询分配了SourceData别名,并且必须使用它:

 FROM ( SELECT FKRecId, Col1, Col2, Col3 FROM TargetTable WHERE FKRecId = @SourceRecordId ) SourceData
 JOIN dbo.OtherTable t On t.PrimaryKey = SourceData.FKRecId
 WHERE ((FKRecId != @SourceRecordId) AND (t.Type = KnownType) AND

或没有子查询

 SELECT
      tt.FKRecId, 
      tt.Col1, 
      tt.Col2, 
      tt.Col3 
 FROM TargetTable as tt
 JOIN dbo.OtherTable t On t.PrimaryKey = tt.FKRecId
 WHERE t.FKRecId != @SourceRecordId AND t.Type = KnownType
    AND tt.FKRecId = @SourceRecordId

不确定过滤器与@SourceRecordId的组合在逻辑上是否合适。