0

タプルが選択した行にあるかどうかを確認したいと思います。

次のようなユーザーがいます(簡略化):

user_id int,
company_id,
subcompany_id

次のようなorg_catモデル:

cat_id,
company_id,
subcompany_id

cat_id=2 のカテゴリに属する​​すべてのユーザーのユーザー ID を選択したいと考えています。

次は間違っています。

SELECT 
    user_id 
FROM "user" 
WHERE 
    company_id IN ( SELECT company_id FROM org_cat where cat_id=2 )
AND
    subcompany_id IN ( SELECT subcompany_id FROM org_cat where cat_id=2 );

{ 1, 3 }、{ 2, 3 }、{ 3, 3 } の組み合わせがある場合 (会社では company_id、subcompany_id および company_id=1、subcompany_id=3 は org_cat で cat_id=2の場合、すべての行がから選択されます。ユーザー- それは正しくありません。

私は私にとって間違った解釈をする次のクエリを意味します:

SELECT 
    user_id 
FROM "user" 
WHERE 
    ( company_id, subcompany_id ) IN ( SELECT company_id, subcompany_id FROM org_cat where cat_id=2 );

postgresql はおそらく ( company_id, subcompany_id ) がタプルであるとは考えていないためです。

正しいクエリの作成を手伝っていただけませんか?

更新します

実際、「( company_id, subcompany_id ) IN...」を含むバリアントも有効ですが、答えより少し遅くなります。ありがとう、a_horse_with_no_name !

4

2 に答える 2