2016-10-27 40 views
0

我需要幫助讓這個工作。我簡化了代碼,但實際上我正在從3個不同的表中進行計數,並需要對結果進行一些數學函數。具體而言,我需要得到2個結果,並將它們相減,然後從另一個計數中分出該答案。oracle減去然後除

SELECT 
    (
     (
     SELECT 82 FROM DUAL 
     ) * 100 

     /

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

我剛剛得到這個工作,如果我把師在同一條線上,並在第一個SELECT語句的最後括號後面輸入一個空格,見下文。我要快速測試一些更真實的東西。 - 曾任職:

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已經說過的那樣 - 三種不同的調用方式代表了在實際情況下對三個不同表格的調用。 – Boneist

+3

@PurdyRA以什麼方式查詢不起作用? – Boneist

回答

0

我使用SQL開發人員和IT是示數,因爲我曾在一個不同的線路好於前值的除號。我發佈了正確格式化的代碼,以使其正常工作。感謝所有那些回覆。

+2

這並不是說它與前一個值不同,完全一樣;這是'/'最後成了一行,[提交](https://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_four.htm#i1039663)前五行作爲一個語句(獲得ORA-00907),其餘的行作爲單獨的語句(獲得ORA-00933)提交。您在SQL \ * Plus中獲得相同的行爲。 (順便說一句,您可能會發現使用內聯視圖或CTE而不是子查詢更清晰;並且可以在模式中至少丟失一個「select」和一些括號)。 –

2

The documentation for SQL*Plus說:

您可以通過以下三種方式之一結束SQL命令:

  • 用分號(;)
  • 通過線路上的斜槓(/)本身
  • 以一個空行

...

線上的斜槓(/)本身也告訴SQL * Plus您希望 運行該命令。在 命令的最後一行末尾按Return鍵。 SQL * Plus會用另一個行號提示您。輸入斜槓 並再次按Return鍵或單擊執行。 SQL * Plus執行命令 並將其存儲在緩衝區中。

該文檔很大程度上也適用於SQL Developer,儘管它始終表現爲SQL * Plus在SQLBLANKLINES關閉時的行爲。

在你原來的查詢中,你會將斜線放在一行上;這不僅僅是因爲它與前一個表達式在不同的路線上,而且它與之前的表達式和下一個表達式在不同的行上。

當它作爲腳本運行時,斜槓會導致前五行作爲一條語句執行,這會生成錯誤「ORA-00907:缺少右括號」。其餘的11行然後作爲單獨的命令執行,它生成「ORA-00933:SQL命令沒有正確結束」(針對該部分的第10行)。

正如你所看到,你只需要重新佈局了一下,但你也可以簡化您的示例有點刪除一個額外的select ... from dual

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

你也可以把你的真實查詢到的CTE (或內嵌視圖),當你來到做最後的計算,這可能是更清晰:

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得到一個單行回來,當然,但你現有的代碼需要太多。