2014-11-08 441 views
0

我有一个SQL表中有N列。称它们为“Col1”,“Col2”,...,“ColN”。我可以找出有多少独特的元素也有在Col1中通过查询:使用SQL查找所有可能的列变量组合

select count(distinct Col1) from mytable

,我能做到这一点,独立对每列。假设我在Col1中有M_1个独特元素,在Col2中有M_2等,我可以使用什么单个命令来查找我的数据集的所有可能组合的总数?也就是说,单个查询会为我计算出什么(M_1 * M_2 * ... * M_N)?

PS:这里对SQL很新,所以我不确定这是否重要 - 但我在Windows上使用MySQL Workbench。

回答

1
SELECT COUNT(*) 
FROM (SELECT DISTINCT col1 FROM YourTable) AS t1 
CROSS JOIN (SELECT DISTINCT col2 FROM YourTable) AS t2 
CROSS JOIN (SELECT DISTINCT col3 FROM YourTable) AS t3 
... 

CROSS JOIN计算给定表之间的叉积。

另一种方式来写这将是:

SELECT COUNT(DISTINCT t1.col1, t2.col2, t3.col3, ...) 
FROM YourTable AS t1 
CROSS JOIN YourTable AS t2 
CROSS JOIN YourTable AS t3 
... 

不过,也许最简单的是:

SELECT COUNT(DISTINCT col1)*COUNT(DISTINCT col2)*COUNT(DISTINCT col3)*... 
FROM YourTable 

这不需要计算任何交叉的产品,所以它应该是最有效的。如果你在列上有索引,它甚至不需要读取表数据,它可以使用索引完成。

+0

+1。 。 。因为我特别喜欢第三种方法。但是,这些不一定等同。我可以让你弄清楚为什么,但原因是'NULL'值。第一个将这些视为一个独特的价值,第二个和第三个则没有。 – 2014-11-08 20:49:18