我正在尝试创建一个文档数据库,它由以下主表构建:
我想设置一个主要概述列表:在我的数据库中显示每个项目 每个文档,但只显示每个文档的 最新< / em> 修订信息。
为了实现我的目标,我明白我必须创建一组不同的查询。
实施例:
Project 1
Document 1.1
Document 1.2
Project 2
Document 2.1
Document 2.2
为实现这一目标,我创建了联合查询“quniProjectsDocuments”:
SELECT ProjectID,0 as [0/DocID],ProjectTitle
FROM tblProjects
UNION ALL
SELECT ProjectID,DocID,DocTitle
FROM tblDocuments
ORDER BY ProjectID, [0/DocID];
这很容易,对吧?只需选择tblDocuments.DocID
,tblDocuments.DocTitle
等和Max(tblRevisions.OurRev)
确定,有效(有点)。只有tblRevisions.OurRev
是我从tblRevisions中选择的唯一字段时,它才有效。如果我添加更多的“修订信息”(即tblRevisions.ClientRev
),除了最大修订记录之外,我还会得到所有修订记录的混乱清单。
如何实现以下目标?:
Project 1
Document 1.1 | Our(Latest)Rev | ClientRev
Document 1.2 | Our(Latest)Rev | ClientRev
Project 2
Document 2.1 | Our(Latest)Rev | ClientRev
Document 2.2 | Our(Latest)Rev | ClientRev
Jcollerton:“我认为你要发现的是你必须要做的 编写一个非常复杂的查询来获取确切格式的数据 你现在想要的。“
RE:我不能将2-3个“简单”的查询结合起来 - 并让它们一起工作吗?如上所述,我已经使用了联合查询(这实现了我在同一列中列出项目和文档的目标(并且还根据它们所属的项目对文档进行排序))。
我还设法通过使用两个不同的查询获得了包含最新修订信息的所有文档的列表:一个MAX -query和一个JOIN查询。如下所示(这些是我在使用设计视图创建联合查询之前做的:
1)MAX查询“qryLastRev”=
SELECT [tblDocuments].DocID, Max([tblRevisions].BSNRev) AS MaxOfBSNRev
FROM tblDocuments
INNER JOIN tblRevisions ON [tblDocuments].DocID=[tblRevisions].DocID
GROUP BY [tblDocuments].DocID;
2)JOIN查询“qryDocsByLastRev”=
SELECT tblDocuments.DocTitle, tblDocuments.OurDocNo, tblDocuments.ClientDocNo, tblRevisions.BSNRev, tblRevisions.ClientRev, tblRevisions.SubDate, tblRevisions.SubCode
FROM tblProjects
INNER JOIN
((qryLastRev INNER JOIN tblDocuments ON qryLastRev.DocID = tblDocuments.DocID)
INNER JOIN tblRevisions ON (tblDocuments.DocID = tblRevisions.DocID)
AND (qryLastRev.MaxOfBSNRev = tblRevisions.BSNRev))
ON tblProjects.ProjectID = tblDocuments.ProjectID;
结果是来自tblDocuments的所有文档及其doc编号的列表 - 以及来自tblRevisions的最新修订信息。
DocTitle | DocNo | Rev | SubDate | SubCode
将union查询和max / join查询组合在一起是否很难?不一定将它们组合成一个单一的查询,而是让它们一起工作吗?
答案 0 :(得分:0)
您可以使用以下方式执行此操作:
SELECT
ProjectTitle, DocTitle, ClientRev
FROM
tblProjects
INNER JOIN
tblDocuments
ON
tblProjects.ProjectID = tblDocuments.ProjectID
INNER JOIN
tblRevisions
ON
tblDocuments.DocID = tblRevisions.DocID
INNER JOIN
(SELECT DocID, MAX(SubDate) FROM tblDocuments GROUP BY DocID) groupedDoc
ON
tblDocuments.DocID = groupedDoc.DocID
这将返回:
Project 1 | Document 1.1 | ClientRev
Project 1 | Document 1.2 | ClientRev
Project 2 | Document 2.1 | ClientRev
Project 2 | Document 2.2 | ClientRev
客户评论是最新评论。
有可能以下列形式获取:
Project 1
Document 1.1 | ClientRev
Document 1.2 | ClientRev
Project 2
Document 2.1 | ClientRev
Document 2.2 | ClientRev
但有两件事。首先,这里有两列,一列用于文档,另一列用于客户审核。当您只有项目名称时,您需要选择要放在第二列中的内容。例如,您可以:
Project 1 | NULL
Document 1.1 | ClientRev
Document 1.2 | ClientRev
Project 2 | NULL
Document 2.1 | ClientRev
Document 2.2 | ClientRev
第二件事是我个人(免责声明!)不会说这是使用SQL的最佳方式。 SQL旨在将数据作为表提供,其中列表示不同的属性。然后,您将从此表中获取数据并在应用程序中对其进行格式化,而不是尝试使用SQL查询进行格式化。我认为这种方法对于你想要实现的目标来说会容易得多!
无论如何,要以您想要的格式获取它,您可以尝试:
SELECT
ProjectTitle, NULL, ProjectID
FROM
tblProjects
UNION ALL
SELECT
DocTitle, ClientRev, ProjectID
FROM
tblDocuments
INNER JOIN
tblRevisions
ON
tblDocuments.DocID = tblRevisions.DocID
INNER JOIN
(SELECT DocID, MAX(SubDate) FROM tblDocuments GROUP BY DocID) groupedDoc
ON
tblDocuments.DocID = groupedDoc.DocID
ORDER BY
ProjectID
答案 1 :(得分:0)
您是否对该MAX(tblRevisions.OurRev)使用GROUP BY子句?我需要查看您尝试获得最终结果的完整查询,以便发布更完整的答案。