如何调整查询以便它可以在同一个表的元素之间执行所有可能的组合(交叉连接)?

时间:2017-06-06 17:55:24

标签: postgresql cross-join

考虑下表:

#this is a.py
def main(i):
 from numpy import sin
 return sin(i)

我需要选择元素列的元素之间的所有可能组合,但是要过滤组列并按列类型进行分组。

使用以下查询,我可以通过过滤组1 的元素来执行此查询(这有类型1,2和3):

#this is b.py
def main(j):
 from random import uniform
 return uniform(0, j)

获得以下结果:

group | type | element
------+------+--------
    1 |    1 | A
    1 |    1 | B
    1 |    2 | C
    1 |    2 | D
    1 |    3 | E
    1 |    3 | F
    2 |    4 | G
    2 |    4 | H
    2 |    5 | I
    2 |    5 | J
    2 |    5 | K
    3 |    4 | L
    3 |    4 | M
    3 |    4 | N
    3 |    5 | O
    3 |    5 | P
    3 |    6 | Q
    3 |    7 | R
    3 |    7 | S
    3 |    7 | T

已经按第2组的元素进行过滤我需要使用另一个减少交叉连接数量的查询,因为第2组的类型较少(只有类型4和5):

SELECT T1.*, T2.type, T2.element, T3.type, T3.element
FROM (SELECT * FROM test WHERE "group" = 1 AND type = 1) AS T1
 CROSS JOIN (SELECT * FROM test WHERE "group" = 1 AND type = 2) AS T2
 CROSS JOIN (SELECT * FROM test WHERE "group" = 1 AND type = 3) AS T3;

获得以下结果:

group | type | element | type | element | type | element
------+------+---------+------+---------+------+--------
    1 |    1 | A       |    2 | C       |    3 | E
    1 |    1 | A       |    2 | C       |    3 | F
    1 |    1 | A       |    2 | D       |    3 | E
    1 |    1 | A       |    2 | D       |    3 | F
    1 |    1 | B       |    2 | C       |    3 | E
    1 |    1 | B       |    2 | C       |    3 | F
    1 |    1 | B       |    2 | D       |    3 | E
    1 |    1 | B       |    2 | D       |    3 | F

最后选择 group 3 过滤的元素,我需要增加交叉连接的数量,因为这个组有4种类型(4,5,6和7):

SELECT T1.*, T2.type, T2.element
FROM (SELECT * FROM test WHERE "group" = 2 AND type = 4) AS T1
 CROSS JOIN (SELECT * FROM test WHERE "group" = 2 AND type = 5) AS T2;

获得以下结果:

group | type | element | type | element
------+------+---------+------+--------
    2 |    4 | G       |    5 | I
    2 |    4 | G       |    5 | J
    2 |    4 | G       |    5 | K
    2 |    4 | H       |    5 | I
    2 |    4 | H       |    5 | J
    2 |    4 | H       |    5 | K

疑问!

如何创建一个可以独立于不同(不同)组,类型和元素数量的结果的单个查询?

为了更好地理解组,类型和元素类型列之间的关系:

SELECT T1.*, T2.type, T2.element, T3.type, T3.element, T4.type, T4.element
FROM (SELECT * FROM test WHERE "group" = 3 AND type = 4) AS T1
 CROSS JOIN (SELECT * FROM test WHERE "group" = 3 AND type = 5) AS T2
 CROSS JOIN (SELECT * FROM test WHERE "group" = 3 AND type = 6) AS T3
 CROSS JOIN (SELECT * FROM test WHERE "group" = 3 AND type = 7) AS T4;

0 个答案:

没有答案