Edited at

縦持ちデータからSQLでAND条件抽出

More than 3 years have passed since last update.


やりたいこと

組み合わせで縦持ちしているテーブルがあると思います。

権限管理やグループ管理とかでよく使うやつかと。

userid
groupid

u01
g01

u01
g02

u01
g03

u02
g02

u02
g03

u03
g01

u04
g01

u04
g02

u05
g02

ここから、「g01とg02の両方に属している(AND)useridを抽出」したいのです。

ぱっと思いつかず調べてみると、

「横持ちに変換する」ソリューションがよくヒットしましたが、

groupidが運用によって増えていくような状況だと、あまり適しません。


思いついた

当然他でもやっている方はいらっしゃるでしょうが、あまり見かけなかったので紹介します。

select userid, count(1) from table where groupid in ('g01','g02') group by userid having count(1) = 2

userid
count(1)

u01
2

u04
2

in句に入る個数をhaving句にも入れる感じです。

'g01','g02','g03' なら having count(1) = 3