2010-10-04 27 views
1

我不确定我说的是否正确,但这是我的困境。我继承了一个应用程序,它需要查找与列表中每个联系人关联的公司。它目前正在编写的应用程序的方式查询DB在以下方面:如何在子选择中包含列表中的匹配项目?

SELECT c.name 
FROM company c 
WHERE c.id = (SELECT u.company_id 
       FROM user u 
       WHERE u.login_id = ?); 

的问题是,它需要查找成千上万的用户这样做此查询一次一个是真的效率低下。我今天准备这样做的是运行1个查询是这样的:

SELECT c.name 
FROM company c 
WHERE c.id = (SELECT u.company_id 
       FROM user u 
       WHERE u.login_id IN LIST (?,?,?...)); 

但我不知道如何将用户的列表,然后匹配回到了公司?我如何获得它以选择与名称匹配的login_id?

更新:如何将以下答案应用于从另一个数据库中抽取合同信息的更复杂的查询?当前的完整查询看起来像这样(这也牵扯了多行,每个活动合约级别都有一行,最后我也希望它将这些行合并为1与所有合约类型的列表,以便我可以在该字段上运行grep “最高”一个(除非还有一个方式做在SQL自定义排序,只返回第一个):

SELECT c.id, 
     c.name, 
     cs.id, 
     cs.name, 
     csc.contract_type, 
     csc.contract_status 
FROM company c, 
     company_site cs, 
     company_site_contract csc 
WHERE c.id = cs.company_id 
     AND cs.id = csq.site_id 
     AND csc.contract_status = 'ACTIVE' 
     AND cs.site_id IN (SELECT cs.site_id 
          FROM user u, 
            contact c, 
            company_site cs 
          WHERE c.id = u.company_id 
            AND cs.id = c.site_id 
            AND u.login_id = ?); 

回答

2
select c.name, u.login_id 
from company c 
inner join user u on u.company_id = c.id 
where u.login_id in (List(?,?,?...)) 

,如果您有不与公司相关的用户,那么这样做

select c.name, u.login_id 
from user u 
left join company c on c.id = u.company_id 
where u.login_id in (List(?,?,?...)) 
+0

我可能想要做一个正确的加入,所以我们看看是否有任何用户没有公司assoc与他们有关。 – JNK 2010-10-04 19:06:41

+0

谢谢!我认为这将工作,当我弄清楚如何将它应用到更多的表格。为了解决问题,我简化了查询,所以现在我需要去应用它到整个事情。 – Raugturi 2010-10-04 19:27:02

+0

没关系,我明白了。如果我只加入所有表格,那么整个选择是不必要的。 – Raugturi 2010-10-04 20:23:59

相关问题