0

こんにちは皆さん、私はこのテーブル構造を持っています

 field 1                  field 2
---------------------------------------------
    1                        1
    1                        2
    2                        1

ではKey選択時はこうであってほしいField2 = 1

 field 1                  field 2
---------------------------------------------
   2                         1

異なる値が含まれているため、返したくありませんfield1 = 1field1 IN (1,2)

本当にありがとうございます。

4

2 に答える 2

1

説明の特定の部分で列名を混同していると思われるため、投稿が不明確に見えます。ただし、サンプル出力から判断すると、次のことを意味していると思います。

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

于 2012-06-26T08:00:10.047 に答える
0
SELECT * FROM table WHERE field_2 = 1 AND field_1 <> 1
于 2012-06-26T06:09:03.093 に答える