如何在子选择中包含列表中的匹配项目?
问题描述:
我不确定我说的是否正确,但这是我的困境。我继承了一个应用程序,它需要查找与列表中每个联系人关联的公司。它目前正在编写的应用程序的方式查询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 = ?);
答
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(?,?,?...))
我可能想要做一个正确的加入,所以我们看看是否有任何用户没有公司assoc与他们有关。 – JNK 2010-10-04 19:06:41
谢谢!我认为这将工作,当我弄清楚如何将它应用到更多的表格。为了解决问题,我简化了查询,所以现在我需要去应用它到整个事情。 – Raugturi 2010-10-04 19:27:02
没关系,我明白了。如果我只加入所有表格,那么整个选择是不必要的。 – Raugturi 2010-10-04 20:23:59