【问题标题】:NESTED SELECT QUERY WITH CASE带案例的嵌套选择查询
【发布时间】:2015-08-16 10:19:29
【问题描述】:

请查看查询。
我面临的问题是:
THEN 子句中的 FROM_LOCATION,TO_LOCATION 需要是 B_TARIFFS 中的值,但是当我在它前面加上 B_TARIFFS.FROM_LOCATIONB_TARIFFS.TO_LOCATION 时,我收到一个错误 @987654323 @。 如果它在ELSE 子句中可用,那么为什么我不能在THEN 子句中使用它。我该怎么做才能得到我想要的结果。
我想从查询中得到的结果是:Get 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;

【问题讨论】:

    标签: sql oracle select subquery case


    【解决方案1】:

    你的问题在于双重嵌套。

    你为什么不改变:

        (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 
    

    【讨论】:

    • 是的,我做了这样的事情,现在我可以访问外部查询的列,所以基本上子查询不知道外部选择查询列。没有其他方法可以将它们放入子查询中吗?
    【解决方案2】:

    正如@alexandergs 所述,错误的原因是子查询嵌套太深。但你有比这更大的问题。 在您的 when 子句中,您根据一些随机行做出决定,因为存在条件 rownum=1 没有排序。 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 的行。

    【讨论】:

    • Alex 的回答解决了这个问题,但是我想知道为什么它不允许我访问嵌套子查询中的外部查询列,是的,我将 when (select ...) = '' 更改为 case when ( .. ) is null,现在查询正在运行。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 2018-05-08
    • 2013-01-19
    • 1970-01-01
    • 2022-11-03
    • 2017-09-09
    • 1970-01-01
    相关资源
    最近更新 更多