テーブル内のすべてのレコードの特定の値(Col1、Col2、Col3として表されます)を、定義済みのColの現在の値に更新する既存のクエリがあります。そのテーブルのソースレコード。このソースレコード(ここではFKRecIdとして表される)このテーブルの外部キーのIDによって定義され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
は、これは、現在のソースレコードで定義された値を使用して、テーブル内の他のすべてのレコードを更新します。ただし、ソースレコードと同じ「タイプ」のレコードのみを更新するという条件を追加する必要があります。 "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文のターゲット表要素でSQL Serverクエリエディタでエラーにつながるの下に表示されます。インテリセンスエラーが"Invalid column name"
と表示されているカラム名を入力すると、テーブル名で修飾すると"the multi part identifier xxx could not be bound"
になります。
私の構文が間違っている場所についての助けに感謝したいと思います。誰かが、私がT-SQLステートメントの例をオンラインリファレンスリソースに向けて教えてくれることを嬉しく思います。彼らはこれに答えました。
ありがとう。
'TargetTable'には、その瞬間に既に別名' SourceData'があります。 –
そして、 'SourceData'サブクエリからFKRecIdカラムを返すことはありません。 –