2017-06-28 136 views
0

私はかなり新しいSQLです。このエラーを修正する方法を見つけるのが難しいです。私は同じテーブルから同じ列名を2回引っ張っているのでエラーが出ることを理解しているので、テーブルの別名を作成しました。
私がしようとしているのは、データベース内のテーブルを更新して、クエリを使用してリンクサーバーからデータを取得することです。ここでSQL UPDATE 'カラム' ID 'が' a 'のために複数回指定されました

はサンプルです:ここでは

UPDATE [Database].dbo.T1 
SET 
    T1.Status = item.Status, 
    T1.CategoryA = c.DESC_TEXT, 
    T1.CategoryB = d.DESC_TEXT 
FROM 
(SELECT c.DESC_TEXT, d.DESC_TEXT 
    inner join CSM_CODE c ON c.DESC_CD = item.ParCat and c.DESC_TYPE = 'PARCAT' 
    inner join CSM_CODE d ON d.DESC_CD = item.ChCat and d.DESC_TYPE = 'CHCAT' 
WHERE 
    T1.Status = 'NEW')) A 

WHERE [Database].dbo.T1.ID = A.ID 

は私の正確なエラーです:

列 'DESC_TEXTが' だから私は何を知らない 'A'

に対して複数回指定されましたこの更新のために私のサブクエリのエイリアスについて行うこと。どんな助けもありがとう!

+0

使用しているデータベースで質問にタグを付けてください。そして、あなたのコードは理にかなっていません。 –

+0

なぜそれが意味をなさないのか分かります。あなたが正しいです。それは後ろ向きです。それが私が私の質問に突っ込むところです。ありがとう! – LDag0507

答えて

0

あなたは

c.DESC_TEXT, d.DESC_TEXT 

で二回DESC_TESTを指定しているに名前を変更してみます。

c.DESC_TEXT category_a , d.DESC_TEXT category_b 

また、参加するにはIDが必要です。

あなたにアイデアを伝える例。

UPDATE [Database].dbo.T1 
SET 
    T1.Status = A.Status, 
    T1.CategoryA = A.CategoryA, 
    T1.CategoryB = A.CategoryB 
FROM 
(SELECT item.status, c.id, c.DESC_TEXT CategoryA, d.DESC_TEXT CategoryB 
    from item -- added after seeing the answer. 
    inner join CSM_CODE c ON c.DESC_CD = item.ParCat and c.DESC_TYPE = 'PARCAT' 
    inner join CSM_CODE d ON d.DESC_CD = item.ChCat and d.DESC_TYPE = 'CHCAT' 
WHERE 
    T1.Status = 'NEW')) A 

WHERE [Database].dbo.T1.ID = A.ID 

未テスト

+0

これはうまくいくように見えます。SQLはSETステートメントの列エイリアスを認識しましたが、サブクエリ全体で「バインドできませんでした」というエラーが発生しました – LDag0507

+0

内部クエリを実行して、どのような結果が得られているかを確認してください。 –

+0

私は必要な結果を得る。テーブルを更新するために必要なもの。サブクエリが機能します。 – LDag0507

0

代わりのFROMそれは以下のようなupdate-join構造でなければなりません。また、複製された列には、列別名を使用します。

UPDATE [Database].dbo.T1 
SET 
    T1.Status = item.Status, 
    T1.CategoryA = A.cdesk, 
    T1.CategoryB = A.ddesk 
JOIN 
(SELECT c.DESC_TEXT as cdesk, d.DESC_TEXT as ddesk 
FROM item 
inner join CSM_CODE c ON c.DESC_CD = item.ParCat and c.DESC_TYPE = 'PARCAT' 
inner join CSM_CODE d ON d.DESC_CD = item.ChCat and d.DESC_TYPE = 'CHCAT' 
WHERE T1.Status = 'NEW')) A  
ON [Database].dbo.T1.ID = A.ID 
+0

キーワード「JOIN」の近くに構文が正しくありません。 'A'付近の構文が正しくありません。 – LDag0507

0

2つの異なるテーブルのDESC_TEXTという列を1つのテーブル、つまりあなたの場合はAに結合します。その場合、DESC_TEXT_cとDESC_TEXT_dのように、これらの2つの列に異なる名前を付け、それに応じてT1を更新する必要があります。

+0

無効な列名エラーが発生しました。 – LDag0507

+0

UPDATE中にSETを実行すると、更新しようとしている列のテーブル名を指定する必要がないためです。 Gordon Linoffの答えを参照してください。彼の答えは、そのエラーを修正します。具体的には、SET句でSET値を求める列の名前のみが必要です。ただし、SET句の外でこれらの列を呼び出す場合は、 "T1"を添付する必要があります。フロントへ。 – CaptainMeow

0

私はあなたが欲しい疑う:

UPDATE T1 
    SET Status = item.Status, 
     CategoryA = c.DESC_TEXT, 
     CategoryB = d.DESC_TEXT 
    FROM [Database].dbo.T1 T1 JOIN 
     CSM_CODE c 
     ON c.DESC_CD = T1.ParCat and c.DESC_TYPE = 'PARCAT' JOIN 
     CSM_CODE d 
     ON d.DESC_CD = item.ChCat and d.DESC_TYPE = 'CHCAT' 
    WHERE T1.Status = 'NEW'; 

書かれているように、あなたのコードは、複数の構文エラーがあります。サブクエリ内のDESC_TEXTへの2つの参照は、氷山の先端です。私は上記があなたが望む論理だと信じています。

+0

リンクされたサーバーからデータを取得するために必要なサブクエリを省略しました。 – LDag0507

+0

@ LDag0507。 。 。 '[Database] .dbo.T1'は' FROM'節にあります。 –

1

ありがとうございました。私は今なぜ私がまだエラーを受けているのか知っています。サブクエリ内でエイリアスを作成した後、SET内のエイリアスを更新できませんでした。

UPDATE [database].dbo.T1 
SET 
    [STATUS] = A.[STATUS], 
    [Scrum Team] = A.team_name, 
    [Parent Category] = A.prodparcat, 
    [Child Category] = A.prodcat 
FROM 
    (SELECT 
    item.SEQ_ID, 
    item.STATUS, 
    c.DESC_TEXT prodparcat, 
    d.DESC_TEXT prodcat 
FROM item 
    inner join csm_code c ON c.DESC_CD = item.parent_cat_cd and c.DESC_TYPE = 'PRODPARCAT' 
    inner join CSM_CODE d ON d.DESC_CD = item.prod_cat and d.DESC_TYPE = 'PRODCAT' 
WHERE 

item.STATUS = 'NEW') A 
WHERE 
    [database.dbo.T1.[external ID] = A.SEQ_ID 

私のエイリアスにいくつかの創造性を必要とするリンクサーバーを照会していたことにも注意してください。全体的に素晴らしい学習経験。

もう一度おねがいします!

関連する問題