Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询-多个内部联接_Sql - Fatal编程技术网

SQL查询-多个内部联接

SQL查询-多个内部联接,sql,Sql,我在SQL方面的知识非常有限,但我必须创建一个报告查询(在EPDM*中),我对内部联接感到迷茫:) *EPDM是一个项目数据管理软件,它有一个报告生成器。这需要一个格式化的查询文件 这是一个工作查询文件内容: @[ListAllDoc] §Name [List all documents] §Company [Econ] §Description [This query lists all documents] §Version [1.1] §Arguments [ Project

我在SQL方面的知识非常有限,但我必须创建一个报告查询(在EPDM*中),我对内部联接感到迷茫:)

*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
] 
目标是指定路径的文件列表,其中包含列文件名+路径+用户名(最新版本)

数据存储在数据库中,如下所示(表和列):

  • 文档=>文档ID、项目ID、文件名、最新版本否
  • DocumentsInProjects=>项目ID、路径、文档ID
  • 修订版=>修订号、文档ID、用户ID
  • 用户=>用户ID、用户名
文档与其路径之间的连接是带有ProjectID列的DocumentsInProjects表

文档上有多个修订,我希望在documents.DocumentID=revisions.DocumentID和documents.latestrevisinno=revisions.RevNr(最新修订的用户)时从修订表中获取UserID

样本数据:

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