我有一个现有查询,它将表中所有记录的特定值(表示为Col1,Col2,Col3)更新为这些Col的当前值,以供定义源表记录。此源记录是由ID是在该表的外键(表示为FKRecId这里)T-SQL更新记录需要添加需要JOIN的条件
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
此更新目前使用源记录中定义的值表中的所有其他记录定义。但是,现在我需要添加一个更进一步的条件,即它只更新与源记录相同的“类型”的那些记录。 “类型”的值保存在另一个表中(该表项的主键是上面提到的外键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查询编辑器。如果我只是在列名称中显示intellisense错误为"Invalid column name"
,如果我使用表名限定它,它将变为"the multi part identifier xxx could not be bound"
。
任何帮助我的错误与我的语法将不胜感激,我也很感激,如果任何人都可以指向我的一个在线参考资源与T-SQL语句的例子超出了我可能应答于此。
谢谢。
到那一刻'TargetTable'已经有别名'SourceData'。 –
而你并没有从'SourceData'子查询中返回FKRecId列。 –