2012-08-12 103 views
0

我想執行的查詢問題是與子查詢的存儲過程

With getusers As 
    (Select userID from userprofspecinst_v where institutionID IN 
    (select institutionID, professionID from userprofspecinst_v where [email protected]) 
    and professionID IN 
    (select institutionID, professionID from userprofspecinst_v where [email protected])) 

    select username from user where userID IN (select userID from getusers) 

這裏就是我想要做的事。給定一個用戶ID和一個視圖,其中包含用戶ID和他們的機構和職業的ID,我想獲得其他用戶ID也有相同院校ID和職業ID的列表。然後用這個用戶ID列表,我想從另一個表(用戶)獲得與每個用戶ID相對應的用戶名。我在嘗試創建過程時遇到的錯誤是:「當子查詢未與EXISTS一起引入時,只能在選擇列表中指定一個表達式。」我正在採取正確的方法來構建這個查詢?

回答

0

下面的查詢應該做你想做的事:

SELECT  u.username 

FROM  user AS u 
INNER JOIN userprofspecinst_v AS up ON u.userID = up.userID 
INNER JOIN (SELECT institutionID, professionID FROM userprofspecinst_v 
       WHERE userID = @userID) AS ProInsts 
        ON (up.institutionID = ProInsts.institutionID 
           AND up.professionID = ProInsts.professionID) 

有效的關鍵部分是最後的INNER JOIN語句 - 這可以構成insitutionsids一張桌子和professsionids用戶ID屬於。然後,我們使用相同的機構標識和職業標識(ON條件)獲取視圖中所有匹配的項目,然後將這些項目鏈接回相應用戶標識(第一個JOIN)上的用戶表。

您可以針對您感興趣的每個用戶標識運行此操作,或者加入查詢結果(您的getusers)(取決於您正在運行的數據庫引擎)。

如果您對JOIN's不熟悉,Jeff Atwood的introductory post是一個很好的起點。

JOIN語句有效地允許您顯示錶格之間的邏輯鏈接 - userId,institutionID和professionID都是foreign keys的候選人的示例 - 因此,不必不斷地子查詢每個表並將結果拼湊在一起,而是可以將所有表格鏈接在一起並過濾到所需的行。這通常是一種更清潔,更可維護的方法(儘管這是意見)。

+0

這樣做的竅門,謝謝! – xxyyxx 2012-08-12 22:57:09