0

次のようなテーブルを設定している場合:

╔══════╦══════╗
║  A   ║  B   ║
╠══════╬══════╣
║ Sam  ║ sec2 ║
║ Sam  ║ sec2 ║
║ Sam  ║ sec2 ║
║ Fred ║ sec1 ║
║ Fred ║ sec2 ║
║ Fred ║ sec1 ║
║ Joe  ║ sec1 ║
║ Joe  ║ sec1 ║
╚══════╩══════╝

結果を出したい

╔═════╦══════╗
║  A  ║  B   ║
╠═════╬══════╣
║ Sam ║ sec2 ║
║ Sam ║ sec2 ║
║ Sam ║ sec2 ║
║ Joe ║ sec1 ║
║ Joe ║ sec1 ║
╚═════╩══════╝

したがって、基本的には、sec1またはsec2にいるが両方ではない人にクエリを実行し、重複を残したいと思います。

私の試み:

SELECT A, B
FROM TABLE
WHERE (A = 'SAM' OR A = 'FRED' OR A = 'JOE') AND NOT (B = 'sec1' AND B = 'sec2')
4

1 に答える 1

3

OK、このクエリは、テーブルに他の列がある場合に役立ちます。サブクエリが行うことは、Aに対してのみ一意であるを個別に取得することですBMAX(B) = MIN(B)と同じCOUNT(DISTINCT B) = 1です。次に、サブクエリの結果は、列を介してテーブル自体に結合されますA

SELECT  y.*
FROM    tableName y
        INNER JOIN
        (
            SELECT  A
            FROM    tableName
            GROUP   BY A
            HAVING  MAX(B) = MIN(B) 
                    AND MAX(B) IN ('sec1', 'sec2')
        ) x ON y.A = x.A

また

SELECT  y.*
FROM    tableName y
        INNER JOIN
        (
            SELECT  A
            FROM    tableName
            GROUP   BY A
            HAVING  COUNT(DISTINCT B) = 1 
                    AND MAX(B) IN ('sec1', 'sec2')
        ) x ON y.A = x.A
于 2013-03-12T03:05:48.330 に答える