2012-06-03 385 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)不会暴露给主查询。