3

わかりました、ここに行きます、私は3つのテーブルを持っています:

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の場合、2つのクエリまたはstatemenを実行せずに、これら2つのIDのproject_namesを返す方法、またはそれらが正しく呼び出される方法を教えてください。これが私の悪いselectステートメントです。

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つの値を取得し、「サブクエリが1つ以上の値を返しました」というエラーが発生します。これを修正して機能させるにはどうすればよいですか?さらに詳しい情報が必要な場合は、お問い合わせください...あいまいな説明については申し訳ありません...

4

4 に答える 4

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'
于 2012-06-03T13:04:34.300 に答える
1

project_distribution サブクエリで equals の代わりに IN キーワードを使用します。

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)
于 2012-06-03T13:10:36.637 に答える
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';
于 2012-06-03T13:04:36.387 に答える
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'
    );

exists の良い点は、内部相関名 (pd,ac) がメイン クエリに公開されないことです。

于 2012-06-03T13:51:29.140 に答える