子查询/嵌入式多重连接?

Subquery / embedded multiple joins?

首先,如果这是重复的,我深表歉意 - 我不太确定我想要实现的目标的正确术语是什么,所以可能错过了其他帖子中的实现。

需要一个查询,它作用于模拟基于文件的系统的单个 table(通过 ODBC 调用到 MySQL 或 Oracle)。

逻辑是return一个项目的最新版本。 latest 是在 VERSION 和 DRAFT 的复合键上定义的。

伪逻辑是

    for each document (
       find highest VERSION
          for each VERSION (
             find highest DRAFT (
                Add item to list
             )
           )
        )
     )

我想知道是否有一种方法可以通过一个带有嵌入式自我选择或连接的查询来实现这一点,或者(对不起,这是术语位分解的地方)

我尝试过:

CREATE TABLE docs
    (
        TYPE        varchar(20) NOT NULL,
        ID          VARCHAR(20) NOT NULL,
        VERSION     VARCHAR(20) NOT NULL,
        DRAFT       VARCHAR(20) NOT NULL

    );
    
INSERT INTO docs (TYPE, ID, VERSION, DRAFT) VALUES ('REQ','doc1', ' ', 'A') ;
INSERT INTO docs (TYPE, ID, VERSION, DRAFT) VALUES ('REQ','doc1', ' ', 'B') ;
INSERT INTO docs (TYPE, ID, VERSION, DRAFT) VALUES ('REQ','doc1', '1', ' ') ;
INSERT INTO docs (TYPE, ID, VERSION, DRAFT) VALUES ('REQ','doc1', '1', 'A') ;
INSERT INTO docs (TYPE, ID, VERSION, DRAFT) VALUES ('REQ','doc1', '2', ' ') ;

INSERT INTO docs (TYPE, ID, VERSION, DRAFT) VALUES ('REQ','doc2', ' ', 'A') ;
INSERT INTO docs (TYPE, ID, VERSION, DRAFT) VALUES ('REQ','doc2', ' ', 'B') ;
INSERT INTO docs (TYPE, ID, VERSION, DRAFT) VALUES ('REQ','doc2', '1', ' ') ;
INSERT INTO docs (TYPE, ID, VERSION, DRAFT) VALUES ('REQ','doc2', '1', 'A') ;
INSERT INTO docs (TYPE, ID, VERSION, DRAFT) VALUES ('REQ','doc2', '2', ' ') ;
INSERT INTO docs (TYPE, ID, VERSION, DRAFT) VALUES ('REQ','doc2', '2', 'A') ;

INSERT INTO docs (TYPE, ID, VERSION, DRAFT) VALUES ('REQ','doc3', ' ', 'A') ;

INSERT INTO docs (TYPE, ID, VERSION, DRAFT) VALUES ('REQ','doc4', ' ', 'A') ;
INSERT INTO docs (TYPE, ID, VERSION, DRAFT) VALUES ('REQ','doc4', '1', ' ') ;

INSERT INTO docs (TYPE, ID, VERSION, DRAFT) VALUES ('TEST','doc1', ' ', 'A') ;
INSERT INTO docs (TYPE, ID, VERSION, DRAFT) VALUES ('TEST','doc1', '1', ' ') ;

select * from docs items
        inner join  ((select ID as vID, max(VERSION) as ver from docs group by ID) vers
            inner join  (select ID as dID, VERSION as dver, max(DRAFT) as dft from docs group by ID, VERSION) drfts
                on (vers.vID = drfts.dID and vers.ver = drfts.dver))
            on items.ID = vers.vID
     where TYPE='REQ'  order by ID;

但我没有得到预期的结果。任何关于我应该研究什么主题/方法的指导将不胜感激。


编辑:回复评论

期望的输出:

doc1,2,' '
doc2,2,'a'
doc3,' ','a'
doc4,1,' '

Logic is to return the latest version of an item. The latest is defined over a composite key of VERSION and DRAFT.

使用window 函数。以下 returns 每个文档一行,最高版本的行,然后是该版本的最高草稿:

select d.*
from (select d.*,
             row_number() over (partition by id order by version desc, draft desc) as seqnum
      from docs d
     ) d
where seqnum = 1;