2012-06-03 94 views
3

OK,這裏有雲,我有3個表:雙select語句的問題,多行返回,子查詢返回多個值

accounts    (account_id,  employee_id, account_name) 
projects    (project_id,  project_name) 
project_distribution (distribution_id, employee_id, project_id) 

我想要做的是從項目返回項目名稱表,如果我有project_distribution表中的項目id。所以,讓我們假設我有employee_id,我要進入project_distribution並做一個select,我得到2個值爲project_id,id 1和2,我如何返回project_names對於這兩個ID沒有做2個querys或statemens或他們如何正確調用,這是我的糟糕的選擇語句。

SELECT project_name 
FROM projects 
WHERE project_id = (SELECT project_id 
         FROM project_distribution 
         WHERE employee_id = (SELECT employee_id 
              FROM accounts 
              WHERE account_name = 'tbogdan' 
              ) 
        ); 

oufcorse我將得到project_distribution 2倍的值,而「子查詢返回多個值」的錯誤,我怎麼能解決這個問題,並使其發揮作用? 如果需要更多的信息,請諮詢......對不起,模糊的描述......

+2

請花一些時間格式化所有內容,以便閱讀和消化。 –

回答

1

嘗試這樣的事情...

SELECT projects.project_name 
FROM projects 
INNER JOIN project_distribution ON (projects.project_id = project_distribution.project_id) 
INNER JOIN accounts ON (project_distribution.employee_id = accounts.employee_id) 
WHERE accounts.employee_id = 'tbogdan' 
0
SELECT projects.project_name 
FROM projects 
INNER JOIN project_distribution distrib 
    ON projects.project_id = distrib.project_id 
INNER JOIN accounts 
    ON distrib.employee_id = accounts.employee_id 
WHERE accounts.account_name = 'tbogdan'; 
+0

好信息,將在接下來的問題:)),我將需要一些加入...謝謝 – TBogdan

1

使用IN關鍵字,而不是等於在project_distribution子查詢。

SELECT project_name 
FROM projects 
WHERE project_id = (SELECT project_id 
         FROM project_distribution 
         WHERE employee_id IN (SELECT employee_id 
              FROM accounts 
              WHERE account_name = 'tbogdan' 
              ) 
        ); 

您可以通過手動輸入您希望從子查詢返回的值來測試沒有子查詢的查詢:

SELECT project_name 
FROM projects 
WHERE project_id IN (1,2) 
+0

男人,非常感謝,它的工作:)! – TBogdan

+0

就是這麼簡單..我有更多的研究... – TBogdan

0

EXISTS也是一種可能性:

SELECT pr.project_name 
FROM projects pr 
WHERE EXISTS (
    SELECT * 
    FROM project_distribution pd 
    JOIN accounts ac ON ac.employee_id = pd.employee_id 
    WHERE ac.account_name = 'tbogdan' 
    ); 

的關於存在的好處在於內部相關名稱(pd,ac)不會暴露給主查詢。