ORACLE SQL相当于给定mysql查询

时间:2014-11-10 08:19:38

标签: sql oracle oracle11g

您好我坚持将此查询从mysql转移到oracle,因为oracle在子查询顺序中创建问题。查询是:

SELECT bt_charges.bt_setup_id, bt_setups.name, IFNULL(bt_charges.charges_for,'OPD') as charges_for_vals, bt_charges.nc_applicable,bt_charges.unit_value,bt_charges.taxtype_id, bt_charges.id, bt_charges.amount, bt_charges.effective_date 
FROM bt_setups JOIN bt_charges ON ( bt_charges.bt_setup_id = bt_setups.id AND 
bt_charges.id = (SELECT id 
                 FROM bt_charges ilaba 
                 WHERE IFNULL(ilaba.charges_for,'OPD') = IFNULL(bt_charges.charges_for,'OPD') 
                     AND ilaba.bt_setup_id= bt_setups.id AND ilaba.effective_date <= '2014-11-10' 
                     AND ilaba.insprovider_id IS NULL AND ilaba.deleted=0 
                 ORDER BY ilaba.effective_date DESC, ilaba.date_entered DESC 
                 LIMIT 1)) 
WHERE bt_setups.status='Active' AND bt_setups.deleted=0 
    AND bt_charges.insprovider_id IS NULL 
ORDER BY bt_setups.name, charges_for ASC

此处,bt_setups ( name, description )是提供的服务  bt_charges (effective_date date, date_entered datetime, charger_for char, bt_setup_id foreign key(bt_setups), insprovider_id foreign key(insproviders) )包含适用于来自effective_date的服务费用,明智的提供商

1 个答案:

答案 0 :(得分:2)

SELECT bc.bt_setup_id, bs.name, 
       NVL(bc.charges_for,'OPD') as charges_for_vals, 
       bc.nc_applicable, bc.unit_value, bc.taxtype_id, 
       bc.id, bc.amount, bc.effective_date 
FROM bt_setups bs JOIN bt_charges bc ON ( bc.bt_setup_id = bs.id AND 
bc.id = (SELECT id FROM 
                    (SELECT ilaba.id, ilaba.bt_setup_id 
                     FROM bt_charges ilaba 
                     WHERE NVL(ilaba.charges_for,'OPD') = NVL(bc.charges_for,'OPD') 
                         AND ilaba.effective_date <= TO_DATE('2014-11-10', 'YYYY-MM-DD') 
                         AND ilaba.insprovider_id IS NULL AND ilaba.deleted=0 
                     ORDER BY ilaba.effective_date DESC, ilaba.date_entered DESC)
                 WHERE bt_setup_id = bs.id AND ROWNUM = 1
                 )) 
WHERE bs.status='Active' AND bs.deleted=0 
    AND bc.insprovider_id IS NULL 
ORDER BY bs.name, charges_for ASC;

IFNULL - &gt; NVL

&#39; 2014年11月10日&#39; - &GT; TO_DATE(&#39; 2014-11-10&#39;,&#39; YYYY-MM-DD&#39;) - 我认为ilaba.effective_date有DATE类型

LIMIT 1 - &gt;父查询中的子查询+ order by中的rownum=1