如何在子选择中包含列表中的匹配项?

时间:2010-10-04 18:54:44

标签: sql oracle

我不确定我是否正确地表达了这一点,但这是我的困境。我继承了一个应用程序,它需要查找与列表中每个联系人关联的公司。它当前编写的方式是应用程序在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 = ?);

1 个答案:

答案 0 :(得分: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(?,?,?...))