2011-12-22 5 views
1

Предположим, у меня есть этот запрос:Как добавить столбец в набор сгруппированных столбцов?

SELECT col1, col2, col3 
FROM tab1 
GROUP BY col1, col2, col3 
HAVING COUNT(*) > 1 -- **************EDIT**************** 

Я хочу, что набор столбцов должен быть уникальным. Но теперь я хочу добавить col4, который можно дублировать, поэтому он не работает, если я добавлю его и сгруппирую.

Есть ли лучший способ сделать это, чем это в SQL Server 2008 R2?

SELECT a.col1, a.col2, a.col3, b.col4 
FROM (
    SELECT col1, col2, col3 
    FROM tab1 
    GROUP BY col1, col2, col3 
    HAVING COUNT(*) > 1 -- **************EDIT**************** 
    ) a JOIN tab1 b 
ON a.col1 = b.col1 
AND a.col2 = b.col2 
AND a.col3 = b.col3 

EDIT: Извините, ребята, это то, что я искал. Вы были правы для запроса, который я опубликовал вначале, простой SELECT сделает это. Мне нужно показать все значения col4, для каждой отдельной группы col1, col2, col3, когда существуют дубликаты.

Спасибо.

ответ

0

Вы можете использовать КТР, но там нет вообще ничего плохого в вашем методе:

WITH G AS (
    SELECT col1, col2, col3 
    FROM tab1 
    GROUP BY col1, col2, col3 
) 
SELECT G.col1, G.col2, G.col3, b.col4 
FROM G JOIN tab1 b 
     ON G.col1 = b.col1 
     AND G.col2 = b.col2 
     AND G.col3 = b.col3; 
+0

же стоимость в плане выполнения :( – olmed0

+0

@ olmed0 права, я не подумайте, что вы действительно собираетесь обойти это. Проблема связана с определением группы, а затем ссылкой на группу, чтобы получить ее детали. Ее можно сделать менее сложной, если ваша группа имеет уникальный идентификатор, но логика остается прежней. – Yuck

+0

ОК, спасибо. Мне просто интересно, не хватает ли у меня какой-то функции, которая могла бы сделать трюк здесь. – olmed0

1

Это технически отличается от того, что вы запрашиваете, но он может удовлетворить ваши требования.

Если вы выберете все четыре столбца, соберите все четыре и выберите COUNT (*), тогда счетчик будет представлять собой только количество раз, которое имеет четвертый столбец для каждого подмножества остальных трех.

SELECT col1, col2, col3, col4, COUNT(*) AS c 
FROM tab1 
GROUP BY col1, col2, col3, col4 

Например, если ваши результаты [ 'JIM', 'Джо', 'ЛПП', 'BILLY', 5], это означает, что у вас есть 5 Billies для каждого Джим Джо Боб в парке трейлеров.

EDIT:

Попробуйте это, как на мой последний комментарий.

SELECT col1, col2, col3, col4 
FROM tab1 
+0

* «Но теперь я хочу добавить col4, который можно дублировать, поэтому он не работает, если я добавлю его и группу это. "* Вы не можете включить' col4' в группу, поскольку OP определенно с просьбой просмотреть ** деталь ** всех значений 'col4'. – Yuck

+0

Да, я читал слово «дублированный» как означающий «дублированный», а не «уникальный». Мой плохой ... –

+0

Дело в том, что мне нужно вставить таблицу с уникальным индексом на col1, col2, col3. Вот почему мне нужны эти уникальные, но col4 может иметь любые значения (0+) – olmed0

1

То, как вы это делаете, похоже на меня. Но вы также можете попробовать SELECT DISTINCT col1, col2, col3 FROM tab1 в своей производной таблице вместо SELECT col1, col2, col3 FROM tab1 GROUP BY col1, col2, col3. Я не уверен, что это имеет какое-то значение в плане выполнения.

Кроме того, я мог бы неправильно понять, что вы пытаетесь достичь, но это выглядит как результат запроса будет такой же, как только SELECT a.col1, a.col2, a.col3, a.col4 FROM table1 a

+0

То же самое, но спасибо. – olmed0

+0

Я, вероятно, что-то пропустил, но не просто «SELECT a.col1, a.col2, a.col3, b.col4 FROM table1' возвращает то же самое? – a1ex07

+0

Ну, теперь я думаю, что ты прав, на самом деле. Но в «реальном» запросе, который у меня есть, я не получаю одинаковых результатов, используя только SELECT и первый запрос, который я разместил. Возможно, это связано с тем, что вложенные представления ... позволяют мне проверять. – olmed0