説明の特定の部分で列名を混同していると思われるため、投稿が不明確に見えます。ただし、サンプル出力から判断すると、次のことを意味していると思います。
field2
同じ に対して同一の値を含むテーブルから行を選択しますfield1
。
field1
とのみを出力する必要がある場合field2
は、次のようにすることができます。
SELECT field1, MAX(field2) AS field2
FROM atable
GROUP BY field1
HAVING COUNT(DISTINCT field2) = 1
DISTINCT
テーブルが の重複したペアを保持できない場合は省略できます(field1, field2)
。
ただし、テーブルにさらに列があり、それらの一部またはすべてを返す必要がある場合は、最初にfield1
上記のように値を取得してから、その行セットを結合して、次のatable
ように完全な行を取得できます。
SELECT t.* /* or specify the necessary columns explicitly */
FROM atable AS t
INNER JOIN (
SELECT field1
FROM atable
GROUP BY field1
HAVING COUNT(DISTINCT field2) = 1
) s ON t.field1 = s.field1
繰り返しDISTINCT
ますが、上記で説明したように省略できます。
SQL Server 2008 を使用しているため、ウィンドウ集計も使用できます。テーブルに の重複が含まれていない場合は(field1, field2)
、次を使用できます。
;
WITH counted AS (
SELECT
*,
cnt = COUNT(*) OVER (PARTITION BY field1)
FROM atable
)
SELECT
field1,
field2,
…
FROM counted
WHERE cnt = 1
ただし、重複が許可されている場合は、わずかに異なるアプローチを使用する必要がありますCOUNT(DISTINCT …)
。あなたが試すことができるものは次のとおりです:
;
WITH counted AS (
SELECT
*,
f2min = MIN(field2) OVER (PARTITION BY field1),
f2max = MAX(field2) OVER (PARTITION BY field1)
FROM atable
)
SELECT
field1,
field2,
…
FROM minmaxed
WHERE f2min = f2max
つまり、field2
すべてのfield1
値の最小値と最大値を取得しています。f2min
次に、 が と同じではない行を除外しています。これは、グループに異なる値f2max
があることを意味するためです。field2