2016-09-09 3 views
0

Я хочу показать все строки, имеющие серию, которые существуют в другой строке.T-SQL Выберите полные строки с одинаковым значением столбца

Если я, как это работает

SELECT 
     [Serial] 
FROM [x].[dbo].[Devices] 
GROUP BY Serial 
HAVING COUNT(*) > 1 

Но когда я добавить больше выберите столбцы

SELECT [ID] 
     ,[UUID] 
     ,[Serial] 
FROM [x].[dbo].[Devices] 
GROUP BY Serial 
HAVING COUNT(*) > 1 

Я получаю

'ID' недопустим в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY.

Почему я не могу выбрать больше столбцов?

Как я могу представить полные строки?

+0

Не могли бы вы объяснить некоторые примеры данных и показать ожидаемый результат? – TheGameiswar

+0

Ваша ошибка в том, что вы группируете только «Серийный», но выбираете 3 coloumns, из которых 2 не указаны в группировке или имеют агрегатную функцию. – Nebi

ответ

1

Если идентификатор и UUID уникальны для серийного номера, попробуйте группировать все столбцы.

SELECT [ID] 
    ,[UUID] 
    ,[Serial] 
FROM [x].[dbo].[Devices] 
GROUP BY Serial 
    ,[ID] 
    ,[UUID] 
HAVING COUNT(*) > 1 
+0

Это дает 0 строк, в то время как только выбор серийных номеров и группировка по серийным номерам дает 940 –

+0

. В этом случае я могу только предположить, что для каждого серийного номера у вас много ID и UUID. – BenjiBoyWick

+0

ID уникален, но UUID нет. но не могу ли я просто группировать многие значения, но только фильтровать по последовательному, имеющего одно и то же значение в других строках? –

2

Надеюсь, вам понадобится этот запрос, он покажет все строки, которые имеют серию, которые существуют в другой строке.

SELECT D1.[ID] 
     ,D1.[UUID] 
     ,D1.[Serial] 
FROM [x].[dbo].[Devices] D1 
JOIN ( SELECT [Serial] 
     FROM [x].[dbo].[Devices] 
     GROUP BY Serial 
     HAVING COUNT(*) > 1) D2 ON D1.[Serial] = D2.[Serial] 
3

Вы можете сделать это с помощью функции окна:

select * 
from (
    select *, 
      count(*) over (partition by [Serial]) as serial_count 
    from [x].[dbo].[Devices] 
) t 
where serial_count > 1; 

Это, как правило, быстрее, чем присоединение к югу выберите с агрегатом.