【发布时间】:2019-03-11 10:16:37
【问题描述】:
我们正在使用 ERP 系统,下面是一个 sql 查询 - 它正在工作:
(它使用的是旧语法)
(select last_name||' '||name||' '||to_char(datum_p,'DD.MM.YYYY')
from
(
select co.kod_id, bu.last_name, bu.name, cl.datum_p, ctl.rid, md.short_name
from ord_odb_l cl, ord_odb_o co, b_users bu, ct_l ctl, m_delivery md
where co.rid_o = cl.rid and bu.id = cl.operator and cl.delivery_place = md.rid
and cl.operator not IN (161,245,46,120,43,184) order by cl.datum_p desc
) aa
where aa.kod_id = orders.SK_ID and aa.rid = orders.rid_ct_a
and aa.short_name = orders.md and aa.datum_p > orders.datum_ok and rownum = 1)
我想使用NVL function 来选择订单之间的名称和数据 - 分配:
(但我认为,子查询是不可能的,否则我失败了,因为我收到错误 - missing right parenthesis)
(select last_name||' '||name||' '||to_char(datum_p,'DD.MM.YYYY')
from
(
NVL(
(select co.kod_id, bu.last_name, bu.name, cl.datum_p, ctl.rid, md.short_name
from ord_odb_l cl, ord_odb_o co, b_users bu, ct_l ctl, m_delivery md
where co.rid_o = cl.rid and bu.id = cl.operator and cl.delivery_place = md.rid
and cl.operator not IN (161,245,46,120,43,184) order by cl.datum_p desc),
(select vo.kod_id, bu.last_name, bu.name, vl.datum_p, ctl.rid, md.short_name
from distrb_l vl, distrb_o vo, b_users bu, ct_l ctl, m_delivery md
where vo.rid_o = vl.rid and bu.id = cl.operator and cl.delivery_place = md.rid
and cl.operator not IN (161,245,46,120,43,184) order by vl.datum_p desc)
)
) aa
where aa.kod_id = orders.SK_ID and aa.rid = orders.rid_ct_a
and aa.short_name = orders.md and aa.datum_p > orders.datum_ok and rownum = 1
)
如果需要,我们也可以加入distrb_l 和ord_odb_l:
(select * from ord_odb_l cl join distrb_l vl ON cl.rid = vl.rid_v)
寻求帮助:
我们有表格:ord_odb_l(订单标题)和ord_odb_o(订单内容),distrb_l(分发标题)和distrb_o(分发内容),b_users(用户表),ct_l (定价表),m_delivery(发货表)
列:kod_id(数字)、last.name - name(varchar2)、datum_p(日期)、rid(数字)、short_name(varchar2)、operator(数字)、delivery_place (数字)
实际表:orders
我知道这有点复杂且难以阅读,但我该如何解决这个问题并获得更好的性能?任何帮助将不胜感激。
【问题讨论】:
-
NVL 作用于单个值,而不是更复杂查询的结果。现在,由于您的代码以错误的方式使用了 NVL 函数,因此很难确定您想要实现什么。