SQL查询-多个内部联接

时间:2020-01-16 16:40:31

标签: 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,路径,DocumentID
  • 修订 => RevNr,DocumentID,UserID
  • 用户 =>用户名,用户名

文档及其路径之间的连接是带有ProjectID列的DocumentsInProjects表。

文档上有多个修订版,当Documents.DocumentID = Revisions.DocumentID和Documents.LatestRevisionNo = Revisions.RevNr(最新修订版的用户)时,我想从修订表中获取用户ID。 / p>

样本数据:

+------------------------------------------------------+
| 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}

请帮助我纠正这个问题:)

更新->解决方案 谢谢大家的帮助,即使我的问题没有得到很好的说明,并且包含错​​误,缺少元素(对此很抱歉):) @ davidc2p在代码校正方面为我提供了最大帮助,在此基础上我进行了一些修改,并且此代码运行良好:

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 R.UserID = U.UserID
WHERE P.ProjectID = {pProjectID}

谢谢大家!

1 个答案:

答案 0 :(得分:2)

应提供有关主键或唯一键的信息。但是考虑到您发送查询的内容有一些错误:

表Documents上没有userID。您的查询应从“修订”表访问UserID。

此外,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}

可能还有其他错误。如果您还提供带有一组示例数据的临时表创建,将会更加容易。

根据唯一性,您的结果可能会显示重复的信息。

相关问题