Sql 创建完整的多2多矩阵
我有两个具有多对多关系的表:Sql 创建完整的多2多矩阵,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有两个具有多对多关系的表: 表A(ida,valA) 表B(idb,valB) 表AB(ida、idb) 我需要在每个元组中返回一个查询: (ida,idb,0/1,如果相关与否) 以下是一些输入/输出示例: 表a ida valA 1 b 2 s 3 l 表B idb valB 11 aaa 22 bbb 33 ccc ida idb 1 11 2 33 表ab idb valB 11 aaa 22
表A(ida,valA)
表B(idb,valB)
表AB(ida、idb) 我需要在每个元组中返回一个查询:
(ida,idb,0/1,如果相关与否) 以下是一些输入/输出示例: 表a
ida valA
1 b
2 s
3 l
表B
idb valB
11 aaa
22 bbb
33 ccc
ida idb
1 11
2 33
表ab
idb valB
11 aaa
22 bbb
33 ccc
ida idb
1 11
2 33
预期成果:
ida idb is_exists
1 11 1
2 11 0
1 33 0
2 33 1
注意,我不需要总是0的置换,例如ida=3或idb=22这是因为这意味着在矩阵中,整行或整列都是0(这表明该行与另一个表没有任何关系)
你需要的是一个有所有可能的对的驾驶台。一种方法是从表a和表B中使用交叉连接:
select allAB.aid, allAB.bid, max(case when ab.aid is not null then 1 else 0 end) as HasPair
from (select distinct a.id as aid, b.id as bid
from TableA a cross join
TableB b
) as allAB left outer join
TableAB ab
on allAB.aid = ab.aid and
allAB.bid = ab.bid
group by allAB.aid, allAB.bid
之后,查询只是汇总并确定TableAB中是否有匹配的记录。您需要的是一个包含所有可能对的驱动表。一种方法是从表a和表B中使用交叉连接:
select allAB.aid, allAB.bid, max(case when ab.aid is not null then 1 else 0 end) as HasPair
from (select distinct a.id as aid, b.id as bid
from TableA a cross join
TableB b
) as allAB left outer join
TableAB ab
on allAB.aid = ab.aid and
allAB.bid = ab.bid
group by allAB.aid, allAB.bid
之后,查询只是汇总并确定TableAB中是否有匹配的记录。为什么在
case
语句周围需要max()
应用程序?因为ab.id不包括在group by子句中。这将为每对生成一行。这还提供了没有关系的记录(请参见我问题中的注释)。无论如何,如果我将allAB创建为自身的交叉连接(只选择一次不同的ida,第二次选择不同的idb),它将非常有效!我本来会投票的,但我还是不能。所以,全世界的人们!如果你读了这个伟大的答案,请投票!!!为什么在case
语句周围需要max()
应用程序?因为group by子句中不包括ab.id。这将为每对生成一行。这还提供了没有关系的记录(请参见我问题中的注释)。无论如何,如果我将allAB创建为自身的交叉连接(只选择一次不同的ida,第二次选择不同的idb),它将非常有效!我本来会投票的,但我还是不能。所以,全世界的人们!如果你读了这个伟大的答案,请投票!!!