我们正在使用ERP系统,下面是一个SQL查询 - 它正在工作:
(它使用的是旧语法)
(选择last_name ||’‘|| name ||’’|| to_char(datum_p,‘DD.MM.YYYY’)从 ( 选择合作….
你不能使用 nvl 从两个 select 返回许多列。
nvl
select
您想要找到最新的日期和匹配的名称。 Union all 来自两者的数据 select 那么 order by 和 rownum 可以做到。
Union all
order by
rownum
来自的行 ord_odb_l 具有更高的优先级,来自的行 distrb_l 是辅助数据源。所以,只有先没有数据 select 查询将从第二个返回:
ord_odb_l
distrb_l
(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)
你的查询是更大的一个,也许是次选择的一部分,因为我们没有看到这是什么 orders 可能你可以简化这项任务,但没有整个形象,很难说更多。无论如何这应该工作。请注意,我将语法更改为 join 形成。表 ct_l 您的查询中没有加入条件,因此使用 cross join , 它是否正确?还有 derlivery 代替 delivery 。
orders
join
ct_l
cross join
derlivery
delivery
还有一件事。我假设第一个表中的行具有更高的优先级,因为这表明您的代码。如果您想要具有最新日期的行,无论哪个表,请使用 order by datum_p desc 代替 order by src, datum_p desc 。
order by datum_p desc
order by src, datum_p desc
此外,在Oracle 12中您可以使用 fetch first row only ,但问题被标记为Oracle 11g。
fetch first row only
正如您所注意到的,如果没有数据访问,结构(并且没有100%知道期望),很难回答这样的问题,但也许这会有所帮助。