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 in org_cat with 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

3
SELECT user_id
FROM "user" U join org_cat on U.company_id = org_cat.company_id 
AND U.subcompany_id = org_cat.subcompany_id 
WHERE org_cat.cat_id = 2

SQL Fiddle:点击这里

于 2013-11-11T13:25:40.207 回答
0

为什么不直接连接元组中的值:

WHERE CAST(company_Id as VARCHAR) + '|' + CAST(subcompany_id as VARCHAR) IN 
    (SELECT CAST(company_Id as VARCHAR) + '|' + CAST(subcompany_id as VARCHAR) FROM ... )
于 2013-11-11T13:21:50.717 回答