2011-12-29 16 views
0

このステートメントを取得してテーブルを更新することはできません。問題が連結構文であることがほぼ確実です。連結構文

はありがとう..を見て、あなたは私がここで間違っつもりか見た場合を教えてください!!

UPDATE TAB1 s 
     SET s.user_NUM = 
      (select e.USER# 
        from TAB2 e 
        where ('e.LAST_NAME'||','||' E.FIRST_NAME')= s.DEALER); 
+0

に置き換える必要がありE.FIRST_NAMEとかもしれないと思いますか? – Lion

+5

「e.LAST_NAME」と「E.FIRST_NAME」を引用したのはなぜですか? *データベーステーブル*に列名として表示され、 'E.FIRST_NAME'はそこに存在してはいけません。むしろ' e.FIRST_NAME'でなければなりません。 – Lion

答えて

7

これらはTAB2の列であると思われますか?その場合は、引用符ドロップする必要があります。

UPDATE TAB1 s 
     SET s.user_NUM = 
      (select e.USER# 
        from TAB2 e 
        where (e.LAST_NAME||', '||E.FIRST_NAME)= s.DEALER); 

をそうしないと、私は考えていないされ、TAB1 where DEALER = 'e.LAST_NAME, E.FIRST_NAME'(すなわちリテラル)内のレコードを一致させるために探しているあなたはまったく何を意味するのかです。


は、「私は、カンマの後ろにスペースを入れたとき、私は単一の行 クエリが複数行を返すというエラーが発生しました。」

したがって、TAB2の複数の行は、TAB1の行と一致します。これであなたのデータが調査されます。

e.LAST_NAME||', '||E.FIRST_NAMEに対してe.USER#が1つしかない場合は、サブクエリにDISTINCTを追加することができます。

select e.LAST_NAME||', '||E.FIRST_NAME 
     , count(distinct e.USER#) 
from TAB2 e 
group by e.LAST_NAME||', '||E.FIRST_NAME 
     having count(distinct e.USER#) > 1 

そのクエリを使用すると、複数のヒットの処理方法を決定する必要があるとしている任意の行を返す場合:でいることを確認してください。

同様に、TAB1の行と一致するTAB2の行がない場合、実行するアクションを決定する必要があります。現時点では、s.user_NUMをNULLに設定します。多分それはあなたが望むものです。

これはビジネスルールに関する決定であり、あなたがしたいことが分かっているだけです。

+0

複数の出品があります!それは元の声明を働かせているのでしょうか?ユーザー#はそれぞれ同じであるため、私は倍数のいずれかを選択するとうれしいです。ありがとうございました!!!! –

+0

私はそれを手に入れました!とrownum = 1を追加すると、元のstatemntに行が挿入されます!!!!!ありがとうございました。すべての............... –

1

私はこの問題は、このSQL文を実行しているときにエラーを取得しているe.FIRST_NAME

UPDATE TAB1 s 
    SET s.user_NUM = 
     (select e.USER# 
       from TAB2 e 
       where (e.LAST_NAME||','||e.FIRST_NAME)= s.DEALER); 
+0

行が更新されたとは言っても、引用符を削除して小文字のeを削除してもエラーは発生せず、 –

+2

表のエイリアスは、Oracleでは大文字と小文字を区別しません。 (そして私が慣れ親しんでいる他のRDBM) –

+1

列の種類は何ですか?末尾の空白を心配する必要がありますか(それを取り除きますか?)、またはコンマの後ろにスペースが必要ですか?あなたが何をしても、メインUPDATEにWHERE句が一致しないSET句のサブクエリには非常に注意してください。 TAB2の中に一致する行が存在しないTAB1(この例では)の行では、 'user_NUM'をnullに設定します。 –