Как объединить SQL-запрос по четырем таблицам? - PullRequest
1 голос
/ 23 февраля 2012

Я не очень хорошо разбираюсь в SQL, поэтому я опубликую таблицы, с которыми я работаю, и то, что я пробовал.

Таблица 1

Installation
   id

Таблица 2 ссылки на 1

Project
   id
   installationid
   name

Таблица 3 ссылки на 2

Assignment
   id
   projectid

Таблица 4 ссылки на 3

AssignmentException
   id
   assignmentid
   type

Я пытаюсь найти Project.name, где AssignmentException.type> 0 для Installation.id = 12345. Наибольший опыт я получаю с простыми внутренними объединениями. Ниже приводится моя неработающая попытка, которая не учитывает Installationid. Короткое объяснение того, как работает ваш код, также будет высоко оценено.

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

Ответы [ 5 ]

2 голосов
/ 23 февраля 2012

Как насчет этого:

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 голос
/ 23 февраля 2012
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

Вам не нужна таблица установки, так как в ней нет дополнительных данных - идентификатора установки в Project достаточно для идентификации установки.Это предполагает, что между установкой и проектом существует ссылочное ограничение PK / FK, и что оно обеспечивается СУБД

1 голос
/ 23 февраля 2012

Я думаю, вы ищете что-то вроде этого:

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

Пояснение:

  • Вам нужно было название проекта, поэтому я и начал (первые две строки).
  • Вы сказали, что вам нужен тип исключения, поэтому я JOIN редактировал Assignment and AssignmentException и добавил WHERE ae.type > 0
  • Вы сказали, что вам нужен ID установки 12345, поэтому я присоединился к этой таблице и изменил WHERE

Надеюсь, это поможет.

1 голос
/ 23 февраля 2012
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
0 голосов
/ 23 февраля 2012
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
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...