2016-10-01 33 views
-1

我執行DB2中的以下查詢:「AMOUNT1」是無效在使用它的上下文

select 
    SUM (orders.totalproduct 
     +orders.TOTALTAX 
     +orders.totalshipping 
     -orders.totaladjustment) as amount1 
from 
    orders 
where 
    amount1>10000 

不執行查詢,我得到這個異常,而不是:

「AMOUNT1」 是不是在使用它的上下文.. SQLCODE = -206,SQLSTATE = 42703,DRIVER有效= 3.64.96 SQL代碼:-206,SQL狀態:42703

我是什麼做錯了?

+0

請正確格式化您的代碼。 –

回答

0

您無法在DB2中同時創建和使用amount1。

試試這個:

select * from (
select SUM (orders.totalproduct+orders.TOTALTAX+orders.totalshipping- orders.totaladjustment) as amount1 from orders 
) tmp where amount1>10000 

或本:

select SUM (orders.totalproduct+orders.TOTALTAX+orders.totalshipping- orders.totaladjustment) as amount1 from orders 
having SUM (orders.totalproduct+orders.TOTALTAX+orders.totalshipping-orders.totaladjustment)>10000 
0

這個話題,因爲回答,我的第一個例子是一個重複的,[但格式不同]。我所提供的東西可能會有一些有價值的東西。

分配給SELECT列表上的表達式的名稱在同一SELECT查詢的每個其他子句的範圍內不可用作參考;例如在那裏分配的名稱可用於在ORDER BY子句中引用,但不能在WHERE子句或HAVING子句中引用 - 因此解釋了所看到的錯誤。

爲了避免重複表達HAVING子句中[注意:該聚合是不是一個WHERE子句中允許除非重寫爲一個標量子選擇],考慮一個派生表內分配一個名稱表達式的結果表達式;可以將名稱範圍劃分爲派生表的查詢。通過消除對重複表達式的引用,如果需要對查詢進行任何修改,那麼也防止必須以相同方式維護這兩個副本。

此處顯示的表格標識符和限定列名稱的使用都是可選的,但要包括明確所引用名稱的來源;示例顯示了兩種編譯派生表的方法以引用指定的表達式。

select S.AMOUNT1 
from table /* Nested Table Expression (NTE) */ 
    (select 
     SUM (orders.totalproduct 
      + orders.TOTALTAX 
      + orders.totalshipping 
      - orders.totaladjustment 
     ) as amount1 
    from orders 
) as S 
where S.amount1>10000 

with /* Common Table Expression (CTE) */ 
    aggSum (AMOUNT1) as 
    (select 
     SUM (orders.totalproduct 
      + orders.TOTALTAX 
      + orders.totalshipping 
      - orders.totaladjustment 
      ) as amount1 /* named here; or, as shown, named above */ 
     from orders 
    ) 
select C.AMOUNT1 
from aggSum as C /* from the above (CTE) */ 
where C.amount1>10000 

雖然下面的選項,以及[一個,我懷疑我會永遠代碼,(因爲),我覺得這要困難得多比剛剛在HAVING子句中取得的重複引用,以表達閱讀[即如接受答案中的第二個例子所示]。該查詢封裝在一個子查詢相同的彙總查詢作爲然後作爲在WHERE子句的標量子查詢引用:

select 
    SUM (orders.totalproduct 
     + orders.TOTALTAX 
     + orders.totalshipping 
     - orders.totaladjustment 
     ) as amount1 
    from orders 
    where (select 
      SUM (orders.totalproduct 
       + orders.TOTALTAX 
       + orders.totalshipping 
       - orders.totaladjustment 
       ) 
      from orders 
     ) > 10000 
0

在DB2中,您不能使用您爲列創建一個別名在where/having的同一子查詢中。

即使在MySQL/BigQuery中,我認爲只能通過/ order by/having語句引用組中的任何別名,而不是where引用。

使用子查詢並在那裏過濾,或複製列的代碼(不帶別名)並將其粘貼到其中。但會推薦子查詢選項。

相關問題