【问题标题】:ORACLE SQL equivalent to given mysql queryORACLE SQL 等价于给定的 mysql 查询
【发布时间】:2014-11-10 17:04:19
【问题描述】:

您好,我一直坚持将这个查询从 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) ) 包含从有效日期开始适用的服务费用,明智的提供者

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:
    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 -> NVL

    '2014-11-10' -> TO_DATE('2014-11-10', 'YYYY-MM-DD') - 我想 ilaba.effective_date 有 DATE 类型

    LIMIT 1 -> 子查询中的order by + 父查询中的rownum=1

    【讨论】:

    • 出现错误:“BT_SETUPS”。“ID”:子查询中的标识符无效。我认为这里无法访问外部表
    • @wisdom 我在查询中添加了“bs”别名
    • @wisdom 我想别名不会有帮助。我已经更新了查询 - Oracle 不允许在子查询中使用父列
    • 感谢它的工作 还有一个问题是使用存在代替id = 有什么好处,如果我们复制 NVL 和日期函数,SQL 也应该对 mysql 有效
    • @wisdom 抱歉,EXISTS 更改了查询。我再次更新了我的答案。您需要从 ilaba 获取具有最新有效日期和 date_entered 的 id,并检查它是否等于 bt_changes.id,但 EXISTS 会检查 ilaba 中是否有任何 id
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 2011-05-09
    相关资源
    最近更新 更多