2010-10-04 57 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

相關問題