簡體   English   中英

帶案例的嵌套選擇查詢

[英]NESTED SELECT QUERY WITH CASE

請看一下查詢。
我面臨的問題是:
THEN子句中的FROM_LOCATIONTO_LOCATION必須是B_TARIFFS中的值,但是當我給它加上B_TARIFFS.FROM_LOCATIONB_TARIFFS.TO_LOCATION前綴時,會收到錯誤消息ORA-00904: Invalid identifier. 如果在ELSE子句中可用,那么為什么不能在THEN子句中使用它。 我該怎么做才能獲得理想的結果。
我從查詢中得到的結果是:獲取from_location,to_location,價目表(基於另一個表的情況)。 我期望外部查詢將其FROM_LOCATION,TO_LOCATION傳遞給CASE ELSE THEN的內部選擇查詢,基於此,將返回關稅價格,這將是外部查詢的第三列。 我該怎么做才能做到這一點。

select FROM_LOCATION, TO_LOCATION,

        case when (
            select  tariff A_tariff where A_tariff.FROM_LOCATION = B_TARIFFS.FROM_LOCATION AND A_tariff.TO_LOCATION = 
            B_TARIFFS.TO_LOCATION AND TO_DATE(sysdate,'YYYY-MM-DD')   between TO_DATE(from_date,'YYYY-MM-DD') and TO_DATE(to_date,'YYYY-MM-DD') 
            and rownum = 1
        ) = ''  
        then  

        (SELECT TARIFF FROM (
        SELECT * FROM A_TARIFF WHERE TRIM(A_TARIFF.FROM_LOCATION) = TRIM(**FROM_LOCATION**) AND 
        TRIM(A_TARIFF.TO_LOCATION) = TRIM(**TO_LOCATION**) ORDER BY A_TARIFF.FROM_DATE DESC 
        ) WHERE ROWNUM = 1) 

        else 

        (select  tariff from A_tariff where A_tariff.FROM_LOCATION = B_TARIFFS.FROM_LOCATION AND A_tariff.TO_LOCATION = 
        B_TARIFFS.TO_LOCATION AND TO_DATE(sysdate,'YYYY-MM-DD')   between TO_DATE(from_date,'YYYY-MM-DD') and TO_DATE(to_date,'YYYY-MM-DD') 
        and rownum = 1) end tariff

        FROM B_TARIFFS
        WHERE FROM_LOCATION LIKE '%ABC%' AND AREA_CODE = 'X' ORDER BY TARIFFS;

您的問題在於雙重嵌套。

你為什么不改變:

    (SELECT TARIFF FROM (
    SELECT * FROM A_TARIFF WHERE TRIM(A_TARIFF.FROM_LOCATION) = TRIM(**FROM_LOCATION**) AND 
    TRIM(A_TARIFF.TO_LOCATION) = TRIM(**TO_LOCATION**) ORDER BY A_TARIFF.FROM_DATE DESC 
    ) WHERE ROWNUM = 1) 

    SELECT TARIFF FROM A_TARIFF WHERE TRIM(A_TARIFF.FROM_LOCATION) = TRIM(B_TARIFFS.FROM_LOCATION) AND 
    TRIM(A_TARIFF.TO_LOCATION) = TRIM(B_TARIFFS.TO_LOCATION) WHERE ROWNUM = 1
    ORDER BY A_TARIFF.FROM_DATE DESC 

如@alexandergs所述,錯誤的原因是子查詢的嵌套太深。 但是,您所面臨的問題要大得多。 在您的when子句中,您會根據一些隨機行進行決策,因為存在條件rownum=1而不進行排序。 else子句中也是else 也不清楚when (select ...) = ''意味着什么-我懷疑您想顯示不為空的內容,但當前的構造方法無法提供此功能。 您必須將查詢重建為如下所示:

select b.from_location, b.to_location, a.tariff, b.tariffs, 
    row_number() over (partition by b.from_location, b.to_location 
                           order by a.from_date desc) rn
  from b_tariffs b
  left join a_tariff a 
         on a.from_location = b.from_location and a.to_location = b.to_location
         and trunc(sysdate) between trunc(a.from_date) and trunc(a.to_date) 
  where b.from_location like '%ABC%' and b.area_code = 'X' order by b.tariffs;

...最終為row_number()添加更多代碼-因此它將根據您的需要對行進行排序,並采用RN = 1的行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM