2016-10-10 80 views
0

以下はSQL問合せです。ORA-01427:1行副問合せは複数の行を戻します。ORA-01427:1行副問合せが複数の行を戻します。SQL問合せ

周りの作業を支援してください:

SELECT * 
FROM TableName err 
WHERE ERR.SYSCD IN 
     (decode(REGEXP_COUNT('TEST1,TEST2', ','), 0, 'TEST3', 
       (SELECT DISTINCT syscd 
       FROM TableName 
       WHERE syscd IN 
        (SELECT err.syscd 
         FROM TableName ERR 
         WHERE ERR.SYSCD NOT IN 
          (SELECT UPPER(
             REGEXP_SUBSTR(
              'TEST1', 
              '[^,]+', 
              1, 
              LEVEL)) 
           CNTRY_CD 
          FROM DUAL 
          CONNECT BY REGEXP_SUBSTR(
              'TEST1', 
              '[^,]+', 
              1, 
              LEVEL) 
             IS NOT NULL) 
        ) 
        OR syscd IS NULL))) 
+3

エラーが一目瞭然です:サブクエリの一つは、複数の行を返しています。ビジネスロジックを検査し、クエリを変更するのに最適です。 –

+1

@TimBiegeleisenは正しい(自明のメッセージです)。これをボーナスとして追加します:ソーステーブルの列にREGEXPを設定してもよろしいですか?テーブルが小さければ、それは大丈夫です。それ以外の場合は、テーブルのフルスキャンを招待しています。 – FDavidov

+1

もし私が賭けの男だったら、SELECT DISTINCT syscdサブクエリが原因であると言いたいのですが、それはあなたが単一の行結果を必要とする唯一のものだからです。あなたがそれを修正するのを助けるためには、あなたが望むことを説明する必要があります。 – Deltharis

答えて

0

そのシンプルな誤解を。

select decode(a, 'a', 'AA', 'b','BB', '??') from (
      select 'a' a from dual 
union all select 'b' a from dual 
union all select 'c' a from dual 
); 

decode内のすべてのオペランドが単一の値であるため、これは

AA 
BB 
?? 

を与える:decode作品がどのようにここにあります。しかし、あなたの質問では、それは明らかです。

SELECT DISTINCT syscd 
      FROM TableName 
      WHERE syscd IN (<some values set>) 
       OR syscd IS NULL 

は複数の行を返します。だから、それを解決するために、あなたはWHERE rownum=1で一つだけの行があることを確認する必要があります

SELECT * 
FROM TableName err 
WHERE ERR.SYSCD IN 
     (decode(REGEXP_COUNT('TEST1,TEST2', ','), 0, 'TEST3', 
       select val from (SELECT DISTINCT syscd val 
       FROM TableName 
       WHERE syscd IN 
        (SELECT err.syscd 
         FROM TableName ERR 
         WHERE ERR.SYSCD NOT IN 
          (SELECT UPPER(
             REGEXP_SUBSTR(
              'TEST1', 
              '[^,]+', 
              1, 
              LEVEL)) 
           CNTRY_CD 
          FROM DUAL 
          CONNECT BY REGEXP_SUBSTR(
              'TEST1', 
              '[^,]+', 
              1, 
              LEVEL) 
             IS NOT NULL) 
        ) 
        OR syscd IS NULL) where rownum=1)) 

はこれが何を期待しないかもしれないので、注意してください。それはサブセレクトから1つの値しか取ることができませんが、あなたが期待しているものであるかどうかは分かりません。

編集

これはあなたにとっては意味がありません。あなたが望むものは、<one set>にsyscdを持っていて、可能であればあなたのデコードの他の値にあります。したがって、それらの間にunionを作成してください。ここで:

SELECT * 
FROM TableName err 
WHERE ERR.SYSCD IN (
       select decode(REGEXP_COUNT('TEST1,TEST2', ','), 0, 'TEST3') 
       from dual 
     union 
       SELECT DISTINCT syscd 
       FROM TableName 
       WHERE syscd IN 
        (SELECT err.syscd 
         FROM TableName ERR 
         WHERE ERR.SYSCD NOT IN 
          (SELECT UPPER(
             REGEXP_SUBSTR(
              'TEST1', 
              '[^,]+', 
              1, 
              LEVEL)) 
           CNTRY_CD 
          FROM DUAL 
          CONNECT BY REGEXP_SUBSTR(
              'TEST1', 
              '[^,]+', 
              1, 
              LEVEL) 
             IS NOT NULL) 
        ) 
        OR syscd IS NULL) 

...しかし、それはまだあまり意味がありません...

関連する問題