我对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
]
目标是指定路径的文件列表,其中包含文件名 + 路径 + 用户名(最新版本)
数据存储在数据库中,如下所示(表和列):
文档及其路径之间的连接是带有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}
谢谢大家!
答案 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}
可能还有其他错误。如果您还提供带有一组示例数据的临时表创建,将会更加容易。
根据唯一性,您的结果可能会显示重复的信息。