2016-10-27 5 views
0

私はこれを働かせるために助けが必要です。私はコードを簡素化しましたが、実際には3つのテーブルから数えていますし、いくつかの数学関数を実行する必要があります。具体的には、私は2つの結果を取得し、お互いからそれらを減算し、別のカウントからその答えを分割する必要があります。オラクル減算してから除算する

SELECT 
    (
     (
     SELECT 82 FROM DUAL 
     ) * 100 

     /

     (select (
        (
        SELECT 100 as Test2 FROM DUAL 
          ) 
        - 
        (
        SELECT 50 as Test2 FROM DUAL 
          ) 
      ) from dual)    
    ) 
FROM DUAL; 

私はちょうど私が最初のselect文の最後の括弧の後に同じラインとスペース上の分裂を置く場合は、以下を参照してください動作するようにこれを得ました。私はもっ​​と素早くいくつかのテストをするつもりです。 は - 勤務:私はSQL Developerを使用していると私は、以前の値と異なる行に分割シンボルを持っていたので、それが出てerroringた

SELECT 
    (
    SELECT 8200 FROM DUAL 
    )/
    (
     select (
        (
        SELECT 100 as Test2 FROM DUAL 
         ) 
        - 
        (
        SELECT 50 as Test2 FROM DUAL 
         ) 
      ) 
     from dual 
    )    

FROM DUAL; 
+0

なぜ「82 * 100 - 100 - 50? –

+1

@DmitryBychenkoおそらく、OPがすでに述べたように、デュアルへの3つの異なる呼び出しは、実際の状況で3つの異なるテーブルへの呼び出しを表していると思われます。 – Boneist

+3

@PurdyRAはどのようにクエリが機能しないのですか? – Boneist

答えて

0

。私は正しく動作するようにフォーマットされたコードを投稿しました。答えた人すべてに感謝します。

+2

これは以前の値とは異なる行にあるわけではありません。 '/'がそれ自身の行に終わったということです(https://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_four.htm#i1039663)最初の5行(ORA-00907を取得)、残りの行は別の文(ORA-00933を取得)として送信されます。 SQL * Plusでも同じ動作が発生します。 (ちなみに、サブクエリではなくインラインビューやCTEを使う方がはっきりしているかもしれませんし、少なくとも1つの 'select'といくつかのカッコがあなたのパターンで失われる可能性があります)。 –

2

The documentation for SQL*Plusは言う:

次の3つのいずれかの方法でSQLコマンドを終了することができます:

  • セミコロン(;)
  • によって行にスラッシュ(/)で自分自身
  • 空白行付き

...

1行にスラッシュ(/)を付けると、SQL * Plusには、 コマンドを実行するよう指示されます。 コマンドの最後の行の最後にReturnキーを押します。 SQL * Plusは、別の行番号でプロンプトを表示します。スラッシュ を入力してReturnキーを押すか、「実行」をクリックします。 SQL * Plusは、コマンド を実行し、バッファに格納します。

このドキュメントはSQL Developerにもほとんど適用されますが、SQL * PlusはSQLBLANKLINESをオフにしても常に動作します。

元のクエリでは、スラッシュを単独の行に置きます。以前の式とは異なる行にあるだけではなく、と異なる行にあり、前の式と次の式の両方がです。

スラッシュを実行すると、最初の5行が1つの文として実行され、 "ORA-00907:missing right parenthesis"エラーが生成されます。残りの11行は別のコマンドとして実行され、「ORA-00933:SQLコマンドが正しく終了していません」(その部分の10行目)が生成されます。

SELECT ((SELECT 82 FROM DUAL) * 100) 
/((SELECT 100 FROM DUAL) - (SELECT 50 FROM DUAL)) FROM DUAL; 

あなたはまたのCTEにあなたの本当のクエリを置くことができる:あなたはあなただけのレイアウトを少し再配置する必要がありますが、あなたもあなたの例1つの余分select ... from dualを除去するためのビットを簡素化することができます見てきたように

(またはインライン・ビュー)、あなたは最終的な計算を行うために来たときに明確であるかもしれない:

WITH t1 AS (SELECT 82 AS val FROM DUAL), 
    t2 AS (SELECT 100 AS val FROM DUAL), 
    t3 AS (SELECT 50 AS val FROM DUAL) 
SELECT (t1.val * 100)/(t2.val - t3.val) 
FROM t1 
CROSS JOIN t2 
CROSS JOIN t3; 

(T1.VAL*100)/(T2.VAL-T3.VAL) 
---------------------------- 
         164 

これは、各サブクエリを想定/ CTEはもちろん、バック単一の行を取得しますが、既存のコードは、あまりにも必要です。