SQL查询-多个内部联接
我在SQL方面的知识非常有限,但我必须创建一个报告查询(在EPDM*中),我对内部联接感到迷茫:) *EPDM是一个项目数据管理软件,它有一个报告生成器。这需要一个格式化的查询文件 这是一个工作查询文件内容:SQL查询-多个内部联接,sql,Sql,我在SQL方面的知识非常有限,但我必须创建一个报告查询(在EPDM*中),我对内部联接感到迷茫:) *EPDM是一个项目数据管理软件,它有一个报告生成器。这需要一个格式化的查询文件 这是一个工作查询文件内容: @[ListAllDoc] §Name [List all documents] §Company [Econ] §Description [This query lists all documents] §Version [1.1] §Arguments [ Project
@[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
]
目标是指定路径的文件列表,其中包含列文件名+路径+用户名(最新版本)
数据存储在数据库中,如下所示(表和列):
- 文档=>文档ID、项目ID、文件名、最新版本否
- DocumentsInProjects=>项目ID、路径、文档ID
- 修订版=>修订号、文档ID、用户ID
- 用户=>用户ID、用户名
+------------------------------------------------------+
| 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}是从选择中获取的变量
请帮助我更正此问题:)
更新->解决方案
感谢大家对我的帮助,即使我的问题没有很好地说明,并且包含错误、缺少元素(对此表示抱歉):)
@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}
谢谢大家! 应提供有关主键或唯一键的信息。但考虑到您发送的查询有一些错误: 表文档上没有用户ID。您的查询应该访问修订表中的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}
可能还有其他一些错误。如果您还提供了带有一组示例数据的临时表创建,那么就更容易了
同样取决于unicity,您的结果可能会显示重复的信息。样本数据、所需结果、适当的数据库标记以及对所需内容的解释都会有所帮助。什么是EPDM?它使用什么样的SQL实现?请您的帖子对此进行澄清/标记。同时删除
其中P.ProjectID={pProjectID}
,这不是传递参数的方法,如果仍然不起作用,请删除所有并开始每次添加一个连接,直到您发现错误。并非所有数据库都支持别名的单引号。此外,并非所有数据库都支持表名和别名之间的“AS”关键字。@norbre,请向我们展示运行的较短版本,以及项目表在哪里?OP应该注意一些非常好的事情。在很多方面你是对的,我的错误是:DocumentsInProject有DocumentID。。我在我的报告中更正了这一点post@davidc2p我写回这样的话:在DP.DocumentID=D.DocumentID上以D的形式连接内部文档。。。但仍然没有work@nobre同样的错误?还是没有结果?如果您没有得到任何结果,那么这与您的数据有关,而不是与数据有关code@Gary不幸的是,当代码包含错误时,我只得到一条空的错误消息。只有当代码正确时,我才能得到结果
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}