2

データベース スキーマは次のように構成されています。

ID | GroupID | VALUE
--------------------
 1 |    1    |   A
 2 |    1    |   A 
 3 |    2    |   B
 4 |    3    |   B

この例では、重複する VALUE を持つすべての行を GET したいのですが、それらは同じグループの一部ではありません。したがって、目的の結果セットは ID (3、4) である必要があります。これらは同じグループ (2、3) に属していないが、同じ値 (B) を保持しているためです。

SQL クエリの作成に問題があり、ガイダンスをいただければ幸いです。ありがとう。

これまでのところ、SQL カウントを使用していますが、GroupId をどうするかわかりません。

SELECT * 
FROM TABLE T
HAVING COUNT(T.VALUE) > 1
GROUP BY ID, GroupId, VALUE
4

3 に答える 3

6

このための最も簡単な方法は、以下を使用することEXISTSです。

SELECT 
    ID 
FROM
    MyTable T1
WHERE
    EXISTS (SELECT 1
            FROM MyTable 
            WHERE Value = t1.Value
            AND GroupID <> t1.GroupID)
于 2012-07-10T15:23:30.933 に答える
1

これが1つの方法です。まず、複数のグループに表示される値を特定し、その情報を使用して元のテーブルで適切な行を見つける必要があります。

select *
from t
where value in (SELECT value
                FROM TABLE T
                GROUP BY VALUE 
                HAVING COUNT(distinct groupid) > 1
               )
order by value

実際、私はこの場合、HAVING句を変更することにより、わずかな変形を好みます。

HAVING min(groupid) <> max(groupid)

これは、複数のグループを探している場合に機能し、COUNTDISTINCTバージョンよりも高速である必要があります。

于 2012-07-10T15:20:41.970 に答える
0
SELECT  ALL_.* 
FROM    (SELECT  *  
         FROM    TABLE_
         GROUP BY ID, GROUPID, VALUE
         ORDER BY ID) GROUPED,
         TABLE_ ALL_
WHERE    GROUPED.VALUE = ALL_.VALUE
AND      GROUPED.GROUPID <> ALL_.GROUPID
于 2012-07-10T15:23:39.530 に答える