查询连接两个表并使用LISTAGG函数

时间:2016-04-20 08:12:32

标签: oracle listagg

我有两张桌子

price
--------

id      value   key
sku1    r1      12  
sku1    r2      13  
sku2    r1      12
sku3    r1      14

specialprice
-----

id      value   key startdate   enddate
sku2    r2      13  20-Mar      20-May
sku3    r1      15  20-Mar      20-May

我正在尝试使用LISTAGG函数并输出如下输出:

output
------
skuid   value
sku1    r1:12,r2:13
sku2    r2:13
sku3    r1:15

如果在specialprice表中有一个条目,并且sysdate在startdate和enddate之间,那么我需要考虑,否则我需要从价格表中获取价值。 在价格表中,id可能有两个条目,我需要LISTAGG这两个记录。 特价价格表可能没有价格表中的ID条目。所以我正在使用FULL OUTER JOIN

我构建的PFB查询:

SELECT
  a.id,
  listagg (a.value | | ':' | | nvl (a.key, ' '), ',') WITHIN GROUP (ORDER BY a.value) AS price
FROM price a 
FULL OUTER JOIN specialprice b
  ON(b.id = a.id)
WHERE sysdate between b.startdate and b.enddate
GROUP BY a.id

但问题是我无法获得specialprice表值和密钥加入。 请帮忙。

2 个答案:

答案 0 :(得分:1)

试试这个:

select id, listagg(value) within group(order by value) as price
from (
select
  p.id, 
  case when sp.id is not null and sysdate between sp.startdate and sp.enddate
    then p.value||':'||p.key
    else p.value||':'||p.key
  end as value
from price p
left outer join specialprice sp
  on p.id = sp.id
)
group by id;

答案 1 :(得分:0)

SELECT a.id,listagg (a.value | | ':' | | nvl (a.key, ' '), ',') 
  WITHIN GROUP (ORDER BY a.value) AS price 
  FROM price a 
  LEFT OUTER JOIN specialprice b 
  ON(b.id = a.id and a.value = b.value and a.key = b.key) 
  WHERE (sysdate between b.startdate and b.enddate OR b.id IS NULL) 
  GROUP BY a.id

根据所解释的要求,如果b中存在匹配的id,则它必须是当前记录。如果找不到匹配记录,则仍必须使用数据。 LEFT OUTER JOIN就足够了。希望这会有所帮助。