私のテーブル:
id attribute
1 2
1 2
2 3
2 4
5 1
5 1
6 3
6 3
6 5
属性がそれぞれで同じである場合、今、私は をid
持つものだけを出力したい。attribute
id
このサンプル テーブルでは、出力は次のようになります。
id attribute
1 2
5 1
SELECT id, MIN(attribute) AS attribute
FROM test
GROUP BY id
HAVING COUNT(DISTINCT attribute) = 1 ;
また:
SELECT id, MIN(attribute) AS attribute
FROM test
GROUP BY id
HAVING MIN(attribute) = MAX(attribute) ;
最後のバージョンは、インデックスがオンになっていると非常に効率的であると予想されます(id, attribute)
このアプローチを使用できます。
SELECT DISTINCT id, attribute
FROM test t1
WHERE (SELECT count(DISTINCT attribute)
FROM test t2
WHERE t2.id = t1.id) = 1
より良いアプローチは次のとおりです。
SELECT
DISTINCT t1.id, t1.attribute
FROM
test t1,
(
SELECT
id,
count(DISTINCT attribute) COUNT
FROM
test
GROUP BY
id
HAVING
COUNT = 1
) t2
WHERE
t1.id = t2.id
代わりに、次のアプローチを使用します。
SELECT DISTINCT ta.id, ta.attribute
FROM test ta
LEFT JOIN test tb
ON ta.id = tb.id AND ta.attribute <> tb.attribute
WHERE tb.id IS NULL;
...私は通常、少なくともネストされたクエリを結合されたテーブルに置き換えようとする傾向があります。もちろん、テーブルが小さければ、それはそれほど重要ではありません。