2016-07-25 95 views
0

我有一个现有查询,它将表中所有记录的特定值(表示为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语句的例子超出了我可能应答于此。

谢谢。

+0

到那一刻'TargetTable'已经有别名'SourceData'。 –

+0

而你并没有从'SourceData'子查询中返回FKRecId列。 –

回答

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 [email protected] 
WHERE [email protected] 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的情况下正常工作。

+0

嗨 - 这对我完美的工作,谢谢你的快速反应 – BWall

0

你是不是从SourceData子查询返回FKRecId列,并试图与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在逻辑上是否正常。