2016-09-09 7 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

あなたは 'Serial'だけでグループ化していますが、2つがグループ化で指定されていない3つのcoloumnsを選択しているか、 – Nebi

答えて

1

IDと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; 

これは、骨材とサブの選択に参加し、その後一般的に高速です。

関連する問題