问题描述
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')
解决方法
您标记了问题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