2014-11-08 4 views
0

У меня есть таблица в SQL, которая имеет N столбцов. Назовите их «Col1», «Col2», ..., «ColN». Я могу узнать, сколько уникальных элементов есть в Col1 по запросу:Использование SQL для поиска всех возможных комбинаций переменных столбца

select count(distinct Col1) from mytable

, и я могу это сделать, независимо для каждого столбца. Предполагая, что у меня есть M_1 уникальные элементы в Col1, M_2 в Col2 и т. Д., Какую единственную команду я могу использовать, чтобы найти общее количество всех возможных комбинаций для моего набора данных? То есть, какой один запрос будет вычислять (M_1 * M_2 * ... * M_N) для меня?

PS: очень новый для SQL здесь, поэтому я не уверен, если это имеет значение, но я использую MySQL Workbench в Windows.

ответ

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». Первое рассматривает их как отличное значение, второе и третье - нет. –