我有一个现有查询,它将表中所有记录的特定值(此处表示为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语句示例,我们也会感激不尽。我可能会在这里找到答案。
感谢。
答案 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
的组合在逻辑上是否合适。