问题描述
我有一组三个表 (T1,T2,T3) 表示来自外部源的字典数据。我需要将表1中的数据与表3中的数据进行匹配,其中all表1中给定OR_ID的行反映在表3中。还有第二个表,在表1和表3的属性 (CD_ID,R_ID2) 之间具有人行横道。例如,表1可能有一个带有两行 (苹果,香蕉) 的键 (水果),表3有一个带有2行 (红色,黄色) 的键 (颜色)。表2有两行 (苹果,红色) 和 (香蕉,黄色)。表1具有带有两行 (小麦,黑麦) 的另一个键 (谷物),表3具有带有一行 (面粉) 的键 (粉末)。表2有两行 (小麦、面粉) 和 (黑麦、威士忌)。以下查询正确返回水果而不是谷物。这似乎过于复杂,我还没有想出更简单的办法。
要继续该示例,如果表3具有额外的行,但仍与表1中的所有行匹配,则仍选择它。
你能看到简化这个的方法吗?
提前感谢,
唐·辛普森
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属性的数量
-检查第二个计数> = 第一个
它给出了一个查询,比如:
您可以在以下位置阅读更多信息:
https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:9534489800346122396
-外部连接所有表,从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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




