Sql 我如何解决这个问题&;达到更好的性能

Sql 我如何解决这个问题&;达到更好的性能,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我们正在使用一个ERP系统,下面是一个sql查询,它正在工作: (使用的是旧语法) 我想使用NVL函数选择订单之间的名称和数据-分发: (但我认为,使用子查询是不可能的,或者我失败了,因为我得到了错误-缺少右括号) 如果有必要,我们也可以加入发行版和ord\u odb\u l: (select * from ord_odb_l cl join distrb_l vl ON cl.rid = vl.rid_v) 如需帮助: (select * from ord_odb_l cl join dis

我们正在使用一个ERP系统,下面是一个sql查询,它正在工作:

(使用的是旧语法)

我想使用
NVL函数
选择订单之间的名称和数据-分发:

(但我认为,使用子查询是不可能的,或者我失败了,因为我得到了错误-
缺少右括号

如果有必要,我们也可以加入
发行版和
ord\u odb\u l

(select * from ord_odb_l cl join distrb_l vl ON cl.rid = vl.rid_v)
如需帮助:

(select * from ord_odb_l cl join distrb_l vl ON cl.rid = vl.rid_v)
我们有表:
order\u odb\u l
(订单标题)和
order\u odb\u o
(订单内容),
distribution\u l
(分销标题)和
distribution\u o
(分销内容),
b\u用户
(用户表),
ct\u l
(定价表),
m\u交付表)

列:
kod\u id
(编号)、
last.name-name
(varchar2)、
datum\u p
(日期)、
rid
(编号)、
short\u name
(varchar2)、
操作员
(编号)、
交货地点
(编号)

实际表格:
订单


我知道这有点复杂,很难理解,但我如何解决这个问题并获得更好的性能呢?任何帮助都将不胜感激。

您不能从两个
select
s中使用
nvl
,返回许多列

你想找到最新的日期和匹配的名字
Union all
从两个
中选择
s,然后
order by
rownum
可以执行此操作

ord\u odb\u l
中的行具有较高的优先级,而
distrb\u l
中的行是辅助数据源。因此,只有在第一个
select
query中没有数据时,才会从第二个
query返回:

(select last_name||' '||name||'   '||to_char(datum_p,'DD.MM.YYYY') 
  from (
    select 1 src, co.kod_id, bu.last_name, bu.name, cl.datum_p, ctl.rid, md.short_name
      from ord_odb_l  cl
      join ord_odb_o  co on co.rid_o = cl.rid 
      join b_users    bu on bu.id = cl.operator 
      cross join ct_l ctl
      join m_delivery md on cl.delivery_place = md.rid
      where cl.operator not IN (161,245,46,120,43,184) 
    union all 
    select 2 src, vo.kod_id, bu.last_name, bu.name, vl.datum_p, ctl.rid, md.short_name 
      from distrb_l   vl
      join distrb_o   vo on vo.rid_o = vl.rid
      join b_users    bu on bu.id = cl.operator
      cross join ct_l ctl
      join m_delivery md on cl.delivery_place = md.rid
      where cl.operator not IN (161,245,46,120,43,184) 
      order by src, 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)
您的查询是Biger one的一部分,可能是subselect,因为我们在这里看不到什么是
订单
等等。。也许你可以简化这个任务,但是如果没有完整的图像,很难说得更多。无论如何,这应该行得通。注意,我将语法更改为
join
form。表
ct\u l
在查询中没有连接条件,因此使用了
交叉连接
,是否正确?还有
交付
,而不是
交付

还有一件事。我假设第一个表中的行具有更高的优先级,因为这表明您的代码。如果您想要具有最新日期的行,无论是哪个表,都可以使用
orderbydatum\p desc
而不是
orderbysrc,datum\p desc

此外,在Oracle 12中,您可以使用
仅获取第一行
,但问题被标记为Oracle 11g


正如您所注意到的,如果没有数据访问、结构(并且没有100%的预期),很难回答这样的问题,但这可能会有所帮助。

NVL只处理一个值,而不是更复杂的查询结果。现在,因为你的代码以错误的方式使用了NVL函数,所以很难确定你想要实现什么。这就是我想要的。非常感谢。。。是的,这是我的错。。(在堆栈溢出上)。
(select last_name||' '||name||'   '||to_char(datum_p,'DD.MM.YYYY') 
  from (
    select 1 src, co.kod_id, bu.last_name, bu.name, cl.datum_p, ctl.rid, md.short_name
      from ord_odb_l  cl
      join ord_odb_o  co on co.rid_o = cl.rid 
      join b_users    bu on bu.id = cl.operator 
      cross join ct_l ctl
      join m_delivery md on cl.delivery_place = md.rid
      where cl.operator not IN (161,245,46,120,43,184) 
    union all 
    select 2 src, vo.kod_id, bu.last_name, bu.name, vl.datum_p, ctl.rid, md.short_name 
      from distrb_l   vl
      join distrb_o   vo on vo.rid_o = vl.rid
      join b_users    bu on bu.id = cl.operator
      cross join ct_l ctl
      join m_delivery md on cl.delivery_place = md.rid
      where cl.operator not IN (161,245,46,120,43,184) 
      order by src, 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)