作项目碰到一个问题, 如下:
两个集合, A为 n组{a, b, c}数据的集合, 而B为m组{catID, a, b, c},
当A的全部成员都出现在B同组的集合内部是, A才是对B可用的, 例如:
A=[1][2][3] B=[x][1][2][3] 或者 B=[x][1][2][3]
[3][4][5], [x][1][2][4] [x][3][4][5], 都称A对B可用
而 如果 B=[x][3][4][5],
[x][1][2][3]
[y][3][4][5]的话, 则是A对B不可用.
这样的sql, 怎么写? 想了好久, 才发现可以用小学时的数学运算解决, 通分!
4 9 4x11 9x7 44 63 19
--- - --- = --------- - ------- = ------ - ----- = - ----
7 11 7x11 11x7 77 77 77
就是说, 要分别得到两个同样结构的sql集合, 现在来求差集, 假定只要1个A集合,
而B集合却有多个, 又, 假设在oracle数据库运行, 如下:
select (catID, a, b, c) from A, (
(select distinct catID from B) --取B的分组, 连接A表,得到积
) matrixA
minus --然后减去B集合
(select (catID, a, b, c) from B)
这样, 我们就可以得到A集合不适用于哪些B集合了.
当然, 实际情况中, 可能A集合也是多个的, 假设A集合的分类ID为catIDA, B集
合的分组ID为catIDB, 那么就有:
select (catIDA, catIDB, a, b, c) from A, (
(select distinct catIDB from B) --取B的分组, 连接A表,得到积
) matrixA
minus --然后减去B集合
(select (catIDA, catIDB, a, b, c) from B,
(select distinct catIDA from A) --取B的分组, 连接A表,得到积
)
这样, 我们就可以得到所有的A集合中, 哪些A集合不适用于哪些B集合了.