繁体   English   中英

从许多sql联接中选择第一行

[英]Selecting the first row out of many sql joins

好吧,所以我正在整理一条路径,以选择特定小说的修订版本:

SELECT Catalog.WbsId, Catalog.Revision, NovelRevision.Revision
  FROM Catalog, BookInCatalog
    INNER JOIN NovelMaster
      INNER JOIN HasNovelRevision
        INNER JOIN NovelRevision
        ON HasNovelRevision.right = NovelRevision.obid
      ON HasNovelRevision.Left=NovelMaster.obid
    ON NovelMaster.obid = BookInCatalog.Right
  WHERE  Catalog.obid = BookInCatalog.Left;

这将返回目录中每个Novel Master的Novel Master中的所有修订。

问题是,我只想要目录中每个小说大师的第一版。 我该怎么做? 哦,顺便说一句:我的sql风格与其他许多风格一样受到阻碍,因为它不支持LIMIT函数。

**** ****更新

因此,使用答案1作为指南,我将查询升级到以下内容:

SELECT Catalog.wbsid
FROM Catalog, BookInCatalog, NovelVersion old, NovelMaster, HasNovelRevision
LEFT JOIN       NovelVersion newRevs
ON           old.revision < newRevs.revision AND HasNovelRevision.right = newRevs.obid
LEFT JOIN       HasNovelRevision NewerHasNovelRevision
ON           NewerHasNovelRevision.right = newRevs.obid
LEFT JOIN       NovelMaster NewTecMst
ON           NewerHasNovelRevision.left = NewTecMst.obid
WHERE Catalog.programName = 'E18' AND Catalog.obid = BookInCatalog.Left
AND BookInCatalog.right = NewTecMst.obid AND newRevs.obid = null
ORDER BY newRevs.documentname;

我在第四行出现错误: “旧”。“修订”:无效的标识符

解决方案 :我不得不去另一个论坛,但是我得到了一个可行的解决方案:

select nr1.title, nr1.revision
from  novelrevision nr1
where nr1.revision in (select min(revision) from novelrevision nr2
    where  nr1.title = nr2.title)

因此,此解决方案使用OA提到的JOIN以及IN关键字将其匹配到修订版。

这样的事情可能会起作用,这称为排他左联接:

....
INNER JOIN  NovelRevision
ON          HasNovelRevision.right = NovelRevision.obid
LEFT JOIN   NovelRevision as NewerRevision
ON          HasNovelRevision.right = NewerRevision.obid
            AND NewerRevision.revision > NovelRevision.revision
...
WHERE       NeverRevision.obid is null

where子句过滤出存在较新修订版本的行。 这有效地将查询限制为最新修订版。

根据您的评论,您可以仅过滤出同一NovelMaster中具有较新版本的版本。 例如:

....
LEFT JOIN   NovelRevision as NewerRevision
ON          HasNovelRevision.right = NewerRevision.obid
            AND NewerRevision.revision > NovelRevision.revision
LEFT JOIN   HasNovelRevision as NewerHasNovelRevision
ON          NewerHasNovelRevision.right = NewerRevision.obid
LEFT JOIN   NovelMaster as NewerNovelMaster
ON          NewerHasNovelRevision.left = NewerNovelMaster.obid
            AND NewerNovelMaster.obid = NovelMaster.obid
....
WHERE       NeverNovelMaster.obid is null

PS:我认为您不能对JOIN进行分组并按照一组ON条件对其进行跟踪。 ON必须直接跟随其JOIN。

您可以使用CTE进行检查

WITH NovelRevesion_CTE(obid,RevisionDate)
AS
(
SELECT obid,MIN(RevisionDate) RevisionDate FROM NovelRevision Group by obid
)
SELECT Catalog.WbsId, Catalog.Revision, NovelRevision.Revision 
  FROM Catalog, BookInCatalog 
    INNER JOIN NovelMaster 
      INNER JOIN HasNovelRevision 
        INNER JOIN NovelRevesion
            INNER JOIN NovelRevesion_CTE
        ON HasNovelRevision.[right] = NovelRevision.obid 
      ON HasNovelRevision.[Left]=NovelMaster.obid 
    ON NovelMaster.obid = BookInCatalog.[Right]
    ON NovelRevesion_CTE.obid = NovelRevesion.obid
  WHERE  Catalog.obid = BookInCatalog.[Left];

首先,它以最小的日期并将它们分组来选择为每本小说编写的第一个修订本(假设对象是小说的前言)。 然后将其添加为查询中的联接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM