2012-02-23 13 views
1

私はSQLでうまくいかないので、私が作業しているテーブルと私が試したテーブルを投稿します。4つのテーブル間でSQLクエリを結合するにはどうすればよいですか?

表1

表2

Assignment 
    id 
    projectid 

表1

Project 
    id 
    installationid 
    name 

表3リンク3

AssignmentException 
    id 
    assignmentid 
    type 
から4リンク2リンク

Installation.id = 12345のAssignmentException.type> 0のProject.nameを見つけようとしています。私が持っている経験は、単純な内部結合です。以下は、私の試みであり、Installationidを考慮に入れなかったものです。あなたのコードがどのように働くかの簡単な説明も大いに評価されます。

select * from ( 
    Assignment INNER JOIN AssignmentException ON Assignment.id = AssignmentException.assignmentID) 
    INNER JOIN Project ON Assignment.projectid = Project.id 
    WHERE AssignmentException.type > 0 
+0

はAssignmentException'が他の任意のものに関し、ここで 'という方法はないようですテーブル。私はあなたがそこで 'assignmentid'を逃したと思いますか? –

+0

@MattGrande - それを指摘してくれてありがとう、私は忘れたassignidを含めるように私の答えを更新しました – mrtsherman

答えて

2

どのようにこの件について:その中に余分なデータが存在しないよう

SELECT p.name 
FROM AssignmentException ex 
    JOIN Assignment a ON ex.id = a.AssignmentId 
    JOIN Project p ON a.ProjectId = p.Id 
WHERE ex.type > 0 
    AND p.InstallationId = 12345 
1
select p.Name 
from Project P 
join Assignment A on A.projectid = P.id 
join AssignmentException AE on AE.id=A.id 
where AE.AssignmentException>0 and P.installationid = 12345 
+2

DBMSによって実施されるインストールとプロジェクト間のPK/FK参照制約を前提として、 –

1

私はあなたがこのような何かを探していると思う:

SELECT p.Name 
FROM Project p 
INNER JOIN Assignment a ON a.projectid = p.id 
INNER JOIN AssignmentException ae ON ae.assignmentid = a.id 
INNER JOIN Installation i ON i.id = p.installationid 
WHERE ae.type > 0 AND i.id = 12345 

説明:

  • あなたはプロジェクト名を必要に応じて、私は(最初の2始めたところですライン)。
  • あなたは例外タイプを必要と言ったので、私JOIN EDの割り当てとAssignmentException、およびWHERE ae.type > 0
  • を追加しましたあなたはインストールID 12345を必要と言ったので、私はそのテーブルに入社し、WHERE

希望これを変更助けてください。

+1

DBMSによって実施されるインストールとプロジェクトの間のPK/FK参照制約を前提として、インストールからの有用なデータはありません。 –

+0

ええ、私はインストールに参加する必要はなかったと思います。 Project.installationidを確認してください。 –

1
SELECT p.name 
    FROM AssignmentException AS e 
    JOIN Assignment   AS a ON a.id = e.assignmentID 
    JOIN Project    AS p ON p.id = a.projectid 
WHERE e.type > 0 
    AND p.installationID = 12345 

インストールテーブルを必要としない - プロジェクトにおけるInstallationIDは、インストールを識別するのに十分です。これは、インストールとプロジェクト間のPK/FKが参照制約があると仮定され、そしてそれはDBMSによって強制されていることを

0
SELECT P.Name 
FROM Project AS P 
--Using EXISTS as you do not need to join unless it is in your output 
--More often, this results in better performance 
WHERE 
    --This pulls in only those projects with Installation ID = 12345 
    P.InstallationId = 12345 
    --This pulls in only projects with Assignments 
    --that have Assignment Exceptions of Type > 0 
    AND EXISTS 
    (
     SELECT 1 
     FROM Assignment AS A 
      JOIN AssignmentException AS AE ON A.ID = AE.ID 
     WHERE A.ProjectId = P.Id AND AE.Type > 0 
    ) 
関連する問題