Ora 00907在SQL中缺少右括号

问题描述

SELECT
    g.msisdn,c.name3,c.id_number,decode(g.sub_state,'B01','Active','B02','Close','B03','Suspend','Barring') STATUS,decode(g.prepaid_flag,'0','Prepaid','1','Postpaid','3','Hybrid') rating,d.offer_name,t.create_date
    FROM inf_subscriber_all g
    INNER JOIN (
    SELECT a.sub_id,a.cust_id,a.offer_id,a.create_date FROM (
    SELECT cust_id,MAX(create_date) AS maxdate FROM his_offers WHERE primary_flag ='1' GROUP BY cust_id) as tm 
    INNER JOIN his_offers a ON a.create_date = tm.maxdate and a.cust_id = tm.cust_id) as a ON a.cust_id = g.cust_id
    INNER JOIN inf_customer_all c ON c.cust_id = a.cust_id
    INNER JOIN pdm_offer d ON d.offer_id = a.offer_id
    WHERE g.msisdn IN ('135018013','197745505','195154724')

请帮助,我不知道为什么我在此sql脚本中缺少正确的括号错误

解决方法

您标记了问题MySQL,但错误消息指示Oracle,语法也是如此(Oracle支持DECODE(),但MySQL不支持。)

查询中的括号会保持平衡。一个令人关注的问题是您使用as关键字为子查询添加别名。 Oracle不支持这一点({as仅允许用于列别名);您需要删除这些内容:

SELECT ...
FROM inf_subscriber_all g
INNER JOIN (
    SELECT ...
    FROM (
        ...
    ) as tm                         ---> here
    INNER JOIN his_offers a ON ...
) as a ON ...                       ---> and here
INNER JOIN inf_customer_all c ON ...
INNER JOIN pdm_offer d ON ...
WHERE ...

关于查询本身:子查询似乎是要为每个his_offer选择具有最大create_date的{​​{1}}行。使用窗口函数可以更有效地表达这一点:

cust_id