使用SQL查找所有可能的列变量组合
问题描述:
我有一个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。
答
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
这不需要计算任何交叉的产品,所以它应该是最有效的。如果你在列上有索引,它甚至不需要读取表数据,它可以使用索引完成。
+1。 。 。因为我特别喜欢第三种方法。但是,这些不一定等同。我可以让你弄清楚为什么,但原因是'NULL'值。第一个将这些视为一个独特的价值,第二个和第三个则没有。 – 2014-11-08 20:49:18