У меня очень ограниченные знания в 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
]
Целью является список файлов указанного пути с колонками имя файла + путь + имя пользователя (из последней редакции)
Данные хранятся в базе данных, как вы видите ниже (таблица и столбцы):
Связь между документами и их путем - это таблица 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}
Возможно, есть и другие ошибки. Было бы проще, если бы вы предоставили также создание временной таблицы с набором данных.
Кроме того, в зависимости от уникальности, ваш результат может отображать дублирующую информацию.