当重复匹配时获取单个记录



我有一个主表

DEF

你可以"项目表的不同UOM列,并为每个列分配优先级。然后使用first聚合函数按优先级进行聚合。

create table master_item
(barcode, article, uom, order_uom, name)
as
select '13000', '100', 'PC', 'T12', 'ABC' from dual union all
select '13001', '101', 'PC', 'T06', 'DEF' from dual union all
select '13001', '101', 'PC', 'C08', 'XYZ' from dual
create table master_
(barcode, article, uom)
as
select cast(null as varchar2(10)), '100', 'PC' from dual union all
select null, '100', 'T12' from dual union all
select null, '101', 'T06' from dual
with mi as (
select
article,
uom,
name,
1 as priority
from master_item
union all
select
article,
order_uom,
name,
2 as priority
from master_item
)
select distinct
m.barcode,
m.article,
max(m.uom)
keep(dense_rank first order by priority) as uom,
max(mi.name) as name
from master_ m
left join mi
on m.article = mi.article
and m.uom = mi.uom
group by m.barcode, m.article
DEF
  1. 您正在创建名为" master_item ";使用SELECT…从master_item…SQL错误:ORA-01731: circular view definition遇到

  2. 如果您的样本数据看起来像在问题中:

WITH        
mstr AS
(
Select 13000 "BARCODE", 100 "ARTICLE", 'PC' "UOM", 'T12' "ORDERING_UOM", 'ABC' "A_NAME" From dual Union All
Select 13001, 101, 'PC', 'T06', 'DEF' From dual Union All
Select 13001, 101, 'PC', 'C08', 'XYZ' From dual
),
items AS
(
Select CAST(Null as VARCHAR2(15)) "BARCODE", '100' "ARTICLE", 'PC' "UOM"  From dual Union All
Select CAST(Null as VARCHAR2(15)), '101', 'T06' From dual
)

…那么Select语句(经过一些小的修正)的结果与预期完全一致。您的代码应该使用JOIN函数而不是旧的,然后所有问题都可以在JOIN的ON子句中解决。对于上面的示例数据,您根本不需要GROUP BY。下面的代码基本上是基于您的代码,只是上面提到的一些调整:

SELECT      i.BARCODE,  i.ARTICLE, i.UOM, m.A_NAME
FROM        items i
INNER JOIN  mstr m ON (   i.BARCODE = m.BARCODE  OR
( i.ARTICLE = m.ARTICLE AND (m.UOM = i.UOM OR m.ORDERING_UOM = i.UOM)  )   
)
--                    
--  R e s u l t
BARCODE         ARTICLE UOM A_NAME
--------------- ------- --- ------
100     PC  ABC    
101     T06 DEF  
  1. 如果您的mstr表看起来像这样,则可能出现行相乘的问题。
BARCODE    ARTICLE UOM ORDERING_UOM A_NAME
---------- ---------- --- ------------ ------
13000        100 PC  T12          ABC    
13001        101 PC  T06          DEF    
13001        101 PC  T06          XYZ   

在本例中,items表中的article 101将连接到mstr表的两行,因为链接将由UOM和ORDERING_UOM列建立。按子句(或不同)分组没有帮助,因为这篇文章的名称不同。这种数据没有意义,因为它会说您有相同的ARTICLE、BARCODE、UOM和ORDERING_UOM,但A_NAME列不同。这可能会产生一个问题,您希望选择哪个A_NAME以及为什么?

相关内容

  • 没有找到相关文章

最新更新