2013-02-07 16 views
6

に結合することができなかった私は、2つのテーブルを有する:(ペアで)SQL更新テーブルセット - マルチパート識別子

  • 表1ガソリンスタンドの =名前を
  • 表2 =共を有します縦情報(とりわけ経度及び緯度)表1

例:

StationID1 StationID2 Name1 Name2 Lattitude1 Longitude1 Lattitude2 Longitude2 Distance 
------------------------------------------------------------------------------------------------ 
93353477 52452 FOO  BAR  NULL  NULL  NULL NULL NULL 
93353527 52452 HENRY BENNY NULL  NULL  NULL NULL NULL 
93353551 52452 GALE SAM  NULL  NULL  NULL NULL NULL 

表2の例:

IDInfo  Name Lattitude Longitude 
------------------------------------------- 
93353477 BAR 37.929654 -87.029622 

IはtableAに存在する座標情報と、このテーブルを更新します。私は、次のエラーメッセージが表示されますSQL Server 2005: The multi-part identifier … could not be bound

update table1 
set t1.[Lattitude1] = t2.[Lattitude] 
from table1 t1 
left join table2 t2 
on (t1.StationID1 = t2.IDInfo) 

ごとに以下のことを実行しようとしました:

メッセージ4104、レベル16、状態1、行を1
マルチパート識別子「T1 .Lattitude1 "は束縛できませんでした。

しかし、私が次のことをすると、別のテーブルに保存することができます。

SELECT t1.[StationID1] 
     ,t1.[StationID2] 
     ,t1.[Name1] 
     ,t1.[Name2] 
     ,t2.[Lattitude] AS [Lattitude1] 
     ,t2.[Longitude] AS [Longitude1] 
     ,t3.[Lattitude] AS [Lattitude2] 
     ,t3.[Longitude] AS [Longitude2] 
from table1 t1 
left join table2 t2 
on (t1.StationID1 = t2.IDInfo) 
left join table2 t3 
on (t1.StationID2 = t2.IDInfo) 

私はSQLに非常に新しいですし、いくつかのものが動作し、他の人がいない理由を理解することは難しい時間を過ごしています。上に掲載したリンクを元に、最初のクエリがうまくいかなければならない - いいえ?おそらく、私はこれを試して何時間も過ごしていたので、私はまっすぐ考えていなかったし、結局同僚の助けを得た(彼女は上記のアプローチを提案した)。

答えて

12

UPDATE文を変更して、UPDATE行のテーブルエイリアスを参照できると思います。

update t1 
set t1.[Lattitude1] = t2.[Lattitude] 
from table1 t1 
left join table2 t2 
on (t1.StationID1 = t2.IDInfo) 
+0

エイリアスを使用するか、まったくFROM句でTABLE1を繰り返すことがない方が良い:table2.IDInfo = table1.StationID1表2から更新TABLE1セットLattitude1 = table2.Lattitude。 SQL Serverの "UPDATE ... FROM"構築は非標準的であり、特にエイリアスが使用されている場合は、少し不思議です。 FROM句のテーブル名またはエイリアス名がUPDATEの後に来るものと一致すると、これらのテーブルは魔法のように識別されますが、リモートクエリが含まれているとこれが破損する可能性があります(UPDATE .. FROMおよびhttp://bit.ly/14EXoZP)。 –

+0

@cgatian、bobs - ご協力いただきありがとうございます。両方のソリューションが機能しました。私はSteve Kassが念のために言及した問題を指摘した。皆さん、ありがとうございました。 – codingknob

0

内部テーブルを変更して、類似した列に別のアリアスを与える必要があります。これはうまくいくはずです。

あなたの特定のケースで
update table1 
set [Lattitude1] = x.[lat] 
from 
(
    SELECT IDInfo [id], Lattitude [lat] FROM 
    table2 
) x 
WHERE 
StationID1 = x.[id] 

LATしLattitudeの名前を変更するために、その必要はありませんが、あなたは自分自身でテーブルを更新し終わると列に異なる名前を与えることに自分自身を強制した場合、それは道をあなたの頭痛の種を保存します。

関連する問題