0

サンプルデータ:

ID1   ID2   Num  Type
---------------------
1     1     1    'A'
1     1     2    'A'
1     2     3    'A'
1     2     4    'A'
2     1     1    'A'
2     2     1    'B'
3     1     1    'A'
3     2     1    'A'

望ましい結果:

ID1   ID2
---------
1     1
1     2
3     1
3     2

ID1 と ID2 でグループ化しているが、Num ではグループ化していないことに注意してください。特に、Type = 'A' のグループを探していることに注意してください。同じテーブルで2つのクエリを結合することで実行できることを知っています.1つのクエリは、異なるタイプを持つすべてのグループを検索し、別のクエリはタイプ= 'A'で行をフィルタリングします。しかし、これをより効率的な方法で行うことができるかどうか疑問に思っていました。

私は SQL Server 2008 を使用しており、現在のクエリは次のとおりです。

SELECT ID1, ID2
FROM (
    SELECT ID1, ID2
    FROM T
    GROUP BY ID1, ID2
    HAVING COUNT( DISTINCT Type ) = 1
) AS SingleType
INNER JOIN (
    SELECT ID1, ID2
    FROM T
    WHERE Type = 'A'
    GROUP BY ID1, ID2
) AS TypeA ON
    TypeA.ID1 = SingleType.ID1 AND
    TypeA.ID2 = SingleType.ID2

編集: 1 つだけでなく 2 つの列でグループ化していることを示すために、サンプル データとクエリを更新しました。

4

2 に答える 2

5
SELECT ID1, ID2
FROM MyTable
GROUP BY ID1, ID2
HAVING COUNT(Type) = SUM(CASE WHEN Type = 'A' THEN 1 ELSE 0 END)
于 2012-02-03T16:52:32.293 に答える
1

集約を必要としない (ただし、別個のものが必要な) 2 つの代替方法があります。

反結合

SELECT DISTINCT t1.ID1, t1.ID2 
FROM
    table  t1
    LEFT JOIN table t2
    ON t1.ID1 = t2.ID1
        and t1.Type <> t2.Type
WHERE
    t1.Type = 'A'
    AND 
    t2.ID1 IS NULL

このdata.se query Sample for 9132209 (Anti-Join)で動作することを確認してください

存在しません

SELECT DISTINCT t1.ID1, t1.ID2 
FROM
    table  t1
WHERE
    t1.Type = 'A'
AND
   NOT EXISTS 
      (SELECT 1 
       FROM table t2 
       WHERE t1.ID1 = t2.ID1 AND Type <> 'A')

このdata.seクエリで動作することを確認してください9132209のサンプルは存在しません

于 2012-02-03T17:44:04.047 に答える