1

caseステートメントを使おうとしていますが、エラーが発生し続けます。ステートメントは次のとおりです。

select TABLE1.acct,
        CASE
          WHEN TABLE1.acct_id in (select acct_id 
                                    from TABLE2 
                                group by acct_id 
                                  having count(*) = 1 ) THEN
             (select name 
                from TABLE3 
               where TABLE1.acct_id = TABLE3.acct_id)
          ELSE 'All Others'
        END as Name
   from TABLE1

THEN式のTABLE1.acct_idをリテラル値に置き換えると、クエリが機能します。クエリのWHEN部分からTABLE1.acct_idを使用しようとすると、結果が複数の行であるというエラーが表示されます。THEN式は、WHENステートメントが使用していた単一の値を無視しているようです。わかりません。おそらく、これはCASEステートメントの有効な使用法ではありません。

TABLE2に1つのエントリがあるアカウントの名前を確認しようとしています。

どんなアイデアでもいただければ幸いです。私はSQLの初心者です。

4

5 に答える 5

1

まず、TABLE1.acctの後にコンマがありません。次に、TABLE1のエイリアスをとしてacct使用しているので、それを使用する必要があります。

Select acct.acct
    , Case 
        When acct.acct_id in ( Select acct_id 
                                From TABLE2 
                                Group By acct_id 
                                Having Count(*) = 1 ) 
            Then ( Select name 
                    From TABLE3 
                    Where acct.acct_id = TABLE3.acct_id
                    Fetch First 1 Rows Only) 
        Else 'All Others' 
        End as Name 
From TABLE1 As acct

他の人が言っているように、1つの値だけが返されるようにTHEN句を調整する必要があります。これを行うには、サブクエリにFetch First 1RowsOnlyを追加します。

于 2010-07-29T18:29:00.920 に答える
1
Then ( Select name 
       From TABLE3 
       Where acct.acct_id = TABLE3.acct_id
       Fetch First 1 Rows Only) 

FetchはCASEステートメントで受け入れられません-「キーワードFETCHは予期されていません。有効なトークン:)UNIONEXCEPT。」

于 2011-02-22T17:26:02.757 に答える
0

ここで起こっていることは、「名前」列の値になるため、ケースは単一の値を返す必要があるということだと思います。サブクエリ(select acct_id from TABLE2 group by acct_id having count(*) = 1 )は1つの値しか返さないため、問題ありません。(select name from TABLE3 where TABLE1.acct_id= TABLE3.acct_id)データによっては、複数の値を返す可能性があります。問題は、複数の値を1つの行の1つのフィールドに押し込もうとしていることです。

次に行うことは、によって複数の行が返される原因となるデータを調べ(select name from TABLE3 where TABLE1.acct_id= TABLE3.acct_id)、このクエリをさらに1行のみを返すように制限できるかどうかを確認することです。必要に応じて、次のような方法を試すこともできます...AND ROWNUM = 1(Oracleの場合-他のDBにも、返される行を制限する同様の方法があります)。

于 2010-07-29T18:35:35.587 に答える
0
select name from TABLE3 where TABLE1.acct_id = TABLE3.acct_id

表3のすべての名前が表示され、表1に行が付随します。前の行の表2から選択された行は、その行に入りません。

于 2010-07-29T18:29:36.313 に答える
0

複数の値を取得している必要があります。

あなたは体を置き換えることができます...

(select count(name) from TABLE3 where TABLE1.acct_id = TABLE3.acct_id)

...倍数を返す行を絞り込むため。

結果セットを減らすために、DISTINCTまたはが必要な場合があります。TOP 1

幸運を!

于 2010-07-29T18:29:38.503 に答える