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),它将非常有效!我本来会投票的,但我还是不能。所以,全世界的人们!如果你读了这个伟大的答案,请投票!!!