2016-11-30 4 views
1

Aがあります。D_DATEの列には、YYYYMMDDという値の列があります(日付形式については気にしません)。私はまた、列名がV_TILLである別のテーブルBを持っています。今、テーブルBのV_TILL列の値をD_DATE列の値をテーブルAに更新して重複も発生させたいと思います。つまり、内側のクエリは、テーブルを更新するクエリを形成する場所から複数のレコードを返すことができます。Oracle SQL別の表の値を持つ1つの表の列を更新します。

私は現在、このクエリが書かれているが、それはエラーがスロー

ORA-01427: single-row subquery returns more than one row

UPDATE TAB_A t1 
SET (V_TILL) = (SELECT TO_DATE(t2.D_DATE,'YYYYMMDD') 
         FROM B t2 
         WHERE t1.BR_CODE = t2.BR_CODE 
         AND t1.BK_CODE = t2.BK_CODE||t2.BR_CODE) 
WHERE EXISTS (
    SELECT 1 
    FROM TAB_B t2 
    WHERE t1.BR_CODE = t2.BR_CODE 
    AND t1.BK_CODE = t2.BK_CODE||t2.BR_CODE) 

PS:私はこの泥沼で立ち往生していますようBK_CODEBK_CODEの連結及びBR_CODE

親切

私を助けIS !どんな助けもありがとう。

+0

これは、複数の行 'B T2からTO_DATE(t2.D_DATE、 'YYYYMMDD') を選択t1.BR_CODE = t2.BR_CODE AND t1.BK_CODE = t2.BK_CODE || T2を返します。 BR_CODE'条件を追加する必要があります –

答えて

1

サブクエリが使用したい多くの値を返す場合は、

rownumを使用できるものがあれば< = 2; あなたは一つの値だけが別個

SET (V_TILL) = (SELECT TO_DATE(t2.D_DATE,'YYYYMMDD') 
         FROM B t2 
         WHERE t1.BR_CODE = t2.BR_CODE 
         AND t1.BK_CODE = t2.BK_CODE||t2.BR_CODE AND ROWNUM <=1) 

または

上記
SET (V_TILL) = (SELECT DISTINCT TO_DATE(t2.D_DATE,'YYYYMMDD') 
         FROM B t2 
         WHERE t1.BR_CODE = t2.BR_CODE 
         AND t1.BK_CODE = t2.BK_CODE||t2.BR_CODE) 

を使用していることがわかっている場合は、回避策です。それを正しく行うには、なぜ複数の価値を得るのかを分析する必要があります。適切な値を選択するためにより洗練されたロジックが必要かもしれません。

+0

「DISTO_DATE」とは何ですか? – jera

+0

コピーペーストエラー – arturro

0
I got it working with this command: 
MERGE INTO TAB_A A 
USING TAB_B B 
ON (A.BK_CODE = B.BK_CODE || B.BR_CODE 
AND A.BR_CODE = B.BR_CODE AND B.BR_DISP_TYPE <> '0' 
AND ((B.BK_CODE, B.BR_SUFFIX) IN (SELECT BK_CODE, 
             MIN(BR_SUFFIX) 
             FROM TAB_B 
             GROUP BY BK_CODE))) 

as mentioned earlier by many, I was missing an extra condition and got it working, otherwise the above mentioned techniques work very well. Thanks to all! 
関連する問題