暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 从表中选择一个键值与另一个表的所有键值匹配的链接

ASKTOM 2019-02-18
192

问题描述

我有一组三个表 (T1,T2,T3) 表示来自外部源的字典数据。我需要将表1中的数据与表3中的数据进行匹配,其中all表1中给定OR_ID的行反映在表3中。还有第二个表,在表1和表3的属性 (CD_ID,R_ID2) 之间具有人行横道。例如,表1可能有一个带有两行 (苹果,香蕉) 的键 (水果),表3有一个带有2行 (红色,黄色) 的键 (颜色)。表2有两行 (苹果,红色) 和 (香蕉,黄色)。表1具有带有两行 (小麦,黑麦) 的另一个键 (谷物),表3具有带有一行 (面粉) 的键 (粉末)。表2有两行 (小麦、面粉) 和 (黑麦、威士忌)。以下查询正确返回水果而不是谷物。这似乎过于复杂,我还没有想出更简单的办法。

with o as (
    select T1.OR_ID, T1.CD_ID, T2.R_ID, 
        count(*) over (partition by T1.OR_ID) as CNT  
    from T1 
    join T2 
        on T2.CD_ID2 = T1.CD_ID
    ), 
x as (
    select o.OR_ID, o.CNT, T3.L_ID, count(*) as CNT_T3 
    from o 
    join T3 
        on T3.R_ID2 = o.R_ID 
    group by o.OR_ID, o.CNT, T3.L_ID 
    )
select x.OR_ID, x.CNT, x.L_ID, x.CNT_T3 
from x 
    where CNT = CNT_T3 
order by x.OR_ID, x.L_ID; 


要继续该示例,如果表3具有额外的行,但仍与表1中的所有行匹配,则仍选择它。

你能看到简化这个的方法吗?

提前感谢,
唐·辛普森

专家解答

你这里有一种关系划分的形式。一种方法是:

-外部连接所有表,从t1开始
-计算每个t1或id的不同t1属性的数量
-计算每个t1 or_id和t3 l_id的不同t3属性的数量
-检查第二个计数> = 第一个

它给出了一个查询,比如:

with rws as (
  select * 
  from   t1
  left   join t2
  on     t1.cd_id = t2.cd_id2
  left   join t3
  on     t2.r_id = t3.r_id2
), counts as (
  select r.*,
         count ( distinct cd_id ) over ( 
           partition by or_id 
         ) t1#,
         count ( distinct r_id2 ) over (
           partition by l_id, or_id 
         ) t3#
  from   rws r
)
  select * from counts
  where  t3# >= t1#
  order  by or_id, l_id;


您可以在以下位置阅读更多信息:

https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:9534489800346122396
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论