SQL:union,max,join

时间:2016-02-21 19:09:00

标签: sql ms-access

我正在尝试创建一个文档数据库,它由以下主表构建:

  • tblProjects
  • tblDocuments(每个项目包含许多文档)
  • tblRevisions(每个文档都有一些修订)

我想设置一个主要概述列表:在我的数据库中显示每个项目 每个文档,但只显示每个文档的 最新< / em> 修订信息

here's my relationships setup

为了实现我的目标,我明白我必须创建一组不同的查询。

A)在同一个列表中显示两个所有文档及其所属的项目:

实施例:

    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];

And it works...

B)仅显示每个文档的最新修订信息:

这很容易,对吧?只需选择tblDocuments.DocIDtblDocuments.DocTitle等和Max(tblRevisions.OurRev)

确定,有效(有点)。只有tblRevisions.OurRev是我从tblRevisions中选择的唯一字段时,它才有效。如果我添加更多的“修订信息”(即tblRevisions.ClientRev),除了最大修订记录之外,我还会得到所有修订记录的混乱清单。

C)结合一切

如何实现以下目标?:

   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

编辑22.02.2016:

  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查询组合在一起是否很难?不一定将它们组合成一个单一的查询,而是让它们一起工作吗?

2 个答案:

答案 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子句?我需要查看您尝试获得最终结果的完整查询,以便发布更完整的答案。