2009-10-22 13 views
5

SorelsというテーブルからSorels_extというテーブルを更新したいとします。それらの間のリンクは、Sorels_extのfkey_idがSorelsテーブルのidentity_columnと同じです。これは私のMergeステートメントでの最初の試行であり、構文を習得しようとしています。Mergeステートメントのヘルプが必要

MERGE Sorels_ext AS SORe 
USING (select SOR.identity_column, CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END from Sorels AS SOR) 
ON (SORe.fkey_id = SOR.identity_column) 

WHEN MATCHED THEN 
    UPDATE SET SORe.fkey_id = SOR.identity_column, SORe.Color = select SOR.identity_column, CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END 
WHEN NOT MATCHED THEN 
    INSERT (SORe.fkey_id, SORe.Color) VALUES (SOR.identity_column, SORe.Color = select SOR.identity_column, CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END); 

私はこれを実行すると、私は次のエラーを取得する:

エラー2009年10月22日1時38分51秒PM 0:00:00.000 SQL Serverデータベースのエラー:キーワードの近くに不正な構文」をに'。

MERGE Sorels_ext AS SORe 
USING (select SOR.identity_column, CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END from Sorels) AS SOR 
ON (SORe.fkey_id = SOR.identity_column) 

WHEN MATCHED THEN 
    UPDATE SET SORe.fkey_id = SOR.identity_column, SORe.Color = CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END 
WHEN NOT MATCHED THEN 
    INSERT (SORe.fkey_id, SORe.Color) VALUES (SOR.identity_column, CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END); 

今、私は次のエラーを取得:

を最初の修正プログラムは、次のようにコードがあり、提案された後、46 0

***はINFO ******

を追加しました

エラー10/22/2009 2:03:29 PM 0:00:00.000 SQL Serverデータベースエラー:MERGEステートメントで使用される挿入列の一覧に、複数の部分の識別子を含めることはできません。代わりに単一の部分識別子を使用してください。 55 0

*******さらに追加情報が****** 提案から調整した後、私は次のようしている:

エラー:

MERGE Sorels_ext AS SORe 
USING (select SOR1.identity_column, CASE 
     WHEN left(SOR1.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR1.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END as colors from Sorels as SOR1) as SOR 
ON (SORe.fkey_id = SOR.identity_column) 

WHEN MATCHED THEN 
    UPDATE SET SORe.fkey_id = SOR.identity_column, SORe.Color = CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END 
WHEN NOT MATCHED THEN 
    INSERT (fkey_id, Color) VALUES (SOR.identity_column, CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END); 

私はエラーを取得します10/22/2009 2:46:51 PM 0:00:00.000 SQL Serverデータベースエラー:無効な列名 'FPARTNO'。 56 0

私は間違っていますか?

**** I got it !!! *****

MERGE Sorels_ext AS SORe 
USING (select SOR.identity_column, CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END as colors from Sorels as SOR) SOR1 
ON (SORe.fkey_id = SOR1.identity_column) 

WHEN MATCHED THEN 
    UPDATE SET SORe.fkey_id = SOR1.identity_column, SORe.Color = SOR1.colors 
WHEN NOT MATCHED THEN 
    INSERT (fkey_id, Color) VALUES (SOR1.identity_column, SOR1.colors); 
+0

おめでとうございます。 –

+0

ほんの少しの追加: 'fkey_id = identity_column'を割り当てることに意味はありません。あなたのクエリはすでに同じ値を持つことを確認しています。 –

答えて

4

私はあなたがそうのようなあなたのソースデータをエイリアスする必要が信じている: "SOR AS)" あなたの "AS" を取り出してみ

USING (select SOR.identity_column, 
    CASE WHEN left(SOR.FPARTNO, 2) = 'BL' 
    THEN 'Blue'   
    WHEN left(SOR.FPARTNO, 2) = 'RD' 
    THEN 'Red'   
    ELSE 'White'  
    END from Sorels AS SOR) **AS SOR** ON (SORe.fkey_id = SOR.identity_column) 
+1

合意。 OPの例では、そのJOINに存在しないテーブルエイリアスが使用されています。 –

+0

私はその訂正と新しいエラーでもう一度編集しました。私は本当にあなたの忍耐を感謝します。 – DavidStein

+0

もう一度更新しました。私は、エイリアスを使用して、作業をより簡単に、より明確にしています。逆の効果があるようです。 – DavidStein

5
INSERT (SORe.fkey_id, SORe.Color) 

お読みください:

INSERT (fkey_id, Color) 

列を挿入リストカリフォルニア州nはターゲット表のみを参照します。パーサーはそこにテーブルエイリアスがあるとは予想せず、それを解決する方法も知らない。

"column1"を見ると、それはターゲットテーブルに属していることがわかります。 "table1.column1"を見ると、 "table1"がトークンとして範囲外にあるので、 "table1"の意味を知らない。

+0

私はこのことについてPeterに同意します。 – rfonn

+0

それはうまくいったのですが、その理由を説明できますか? – DavidStein

+1

挿入リスト内の列はターゲット表のみを参照することができるため、パーサはそこで表の別名を参照することを想定しておらず、解決方法はわかりません。 "column1"と表示され、ターゲット表に属していることがわかります。それは "table1.column1"を見て、 "table1"の意味を知らない。 "table1"は範囲外であるため、話すことができます。 –

関連する問題