2016-07-25 27 views
0

テーブル内のすべてのレコードの特定の値(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ステートメントの例をオンラインリファレンスリソースに向けて教えてくれることを嬉しく思います。彼らはこれに答えました。

ありがとう。

+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可能な場合、NULLの場合は比較が正しく機能するように注意する必要があります。

+0

こんにちは - これは私にとって完璧に働いた、すばやい応答のおかげで – BWall

0
あなたは SourceDataサブクエリから FKRecId列を返すと、すでにそのサブクエリに SourceDataエイリアスを割り当てて、それを使用する必要がありながら TargetTableでそれにアクセスしようとしていない

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であるかどうかは、論理的には分かりません。

関連する問題