SQL-запрос - множественное внутреннее соединение

У меня очень ограниченные знания в SQL, но мне нужно создать запрос отчета (в EPDM *), и я потерялся с INNER JOIN :)

* EPDM - это программа управления данными проекта, в которой есть генератор отчетов. Для этого нужен отформатированный файл запроса.

Это рабочее содержимое файла запроса:

@[ListAllDoc] 
§Name [List all documents] 
§Company [Econ] 
§Description [This query lists all documents] 
§Version [1.1] 
§Arguments
[
  ProjectID pProjectID [1] [Select search folder. E.g "$Documents", or browse for folder.]
]
§Sql 
[ 
SELECT D.Filename as 'File Name', P.Path As 'Path'
FROM Projects AS P 
INNER JOIN DocumentsInProjects AS DP ON P.ProjectID = DP.ProjectID
INNER JOIN Documents AS D ON DP.DocumentID = D.DocumentID
WHERE P.ProjectID = {pProjectID}
Order By P.Path ASC, D.Filename ASC
] 

Целью является список файлов указанного пути с колонками имя файла + путь + имя пользователя (из последней редакции)

Данные хранятся в базе данных, как вы видите ниже (таблица и столбцы):

  • Документы => DocumentID, ProjectID, Имя файла, LatestRevisionNo
  • DocumentsInProjects => ProjectID, Path, DocumentID
  • Revisions => RevNr, DocumentID, UserID
  • Users => UserID, имя пользователя

Связь между документами и их путем - это таблица DocumentsInProjects со столбцом ProjectID.

В документах есть несколько ревизий, и я бы хотел получить идентификатор пользователя из таблицы ревизий, когда Documents.DocumentID = Revisions.DocumentID и Documents.LatestRevisionNo = Revisions.RevNr (пользователь последней ревизии).

Образец данных:

+------------------------------------------------------+
| Documents                                            |
+------------+-----------+----------+------------------+
| DocumentID | ProjectID | Filename | LatestRevisionNo |
+------------+-----------+----------+------------------+
| 100        | 10        | Test.txt | 3                |
+------------+-----------+----------+------------------+

+------------------------------------------------+
| DocumentsInProjects                            |
+---------------------+-------------+------------+
| ProjectID           | Path        | DocumentID |
+---------------------+-------------+------------+
| 10                  | D:TestPath | 100        |
+---------------------+-------------+------------+

+-----------------------------+
| Revisions                   |
+-------+------------+--------+
| RevNr | DocumentID | UserID |
+-------+------------+--------+
| 1     | 10         | 55     |
+-------+------------+--------+
| 2     | 10         | 46     |
+-------+------------+--------+
| 3     | 10         | 32     |
+-------+------------+--------+

+-------------------+
| Users             |
+--------+----------+
| UserID | Username |
+--------+----------+
| 55     | Peter    |
+--------+----------+
| 46     | Mike     |
+--------+----------+
| 32     | Lucy     |
+--------+----------+

С приведенными выше примерами данных я бы хотел получить результат:

+-----------+-------------+------+
| File Name | Path        | User |
+-----------+-------------+------+
| Test.txt  | D:TestPath | Lucy |
+-----------+-------------+------+

Вот где я сейчас, но это, конечно, не работает: D

{pProjectID} - это переменная, взятая из выбора.

SELECT D.Filename As 'File Name', P.Path As 'Path', U.Username as 'User'
FROM Projects AS P
INNER JOIN DocumentsInProjects AS DP ON P.ProjectID = DP.ProjectID
INNER JOIN Documents AS D ON DP.DocumentID = D.DocumentID
INNER JOIN Revisions AS R ON D.DocumentID = R.DocumentID AND D.LatestRevisionNo = R.RevNr
INNER JOIN Users AS U ON U.UserID = D.UserID
WHERE P.ProjectID = {pProjectID}

пожалуйста, помогите мне исправить это :)

Всего 1 ответ


Необходимо предоставить информацию о первичных ключах или уникальных ключах. Но, учитывая, что вы отправили запрос, есть некоторые ошибки:

Там нет идентификатора пользователя в таблице документов. Ваш запрос должен получить доступ к UserID из таблицы Revisions.

Кроме того, DocumentID не является полем из DocumentsInProjects, вы должны связать эту таблицу с ProjectID и, следовательно, получить все документы, связанные с проектом.

Кроме того, путь от DP не P.

SELECT D.Filename As 'File Name', DP.Path As 'Path', U.Username as 'User'
FROM Projects AS P

    INNER JOIN DocumentsInProjects AS DP 
    ON P.ProjectID = DP.ProjectID

    INNER JOIN Documents AS D 
    ON DP.ProjectID= D.ProjectID

    INNER JOIN Revisions AS R 
    ON D.DocumentID = R.DocumentID 
    AND D.LatestRevisionNo = R.RevNr

    INNER JOIN Users AS U 
    ON U.UserID = R.UserID

WHERE P.ProjectID = {pProjectID}

Возможно, есть и другие ошибки. Было бы проще, если бы вы предоставили также создание временной таблицы с набором данных.

Кроме того, в зависимости от уникальности, ваш результат может отображать дублирующую информацию.


Есть идеи?

10000