子查询/嵌入式多个联接?

时间:2020-10-01 12:48:48

标签: sql join odbc self-join

如果这是重复的话,首先道歉-我不太确定我要实现的正确术语是什么,因此可能错过了其他帖子中的实现。

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

逻辑是返回项目的最新版本。最新版本是通过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,''

1 个答案:

答案 0 :(得分:1)

逻辑是返回项目的最新版本。最新版本是通过VERSION和DRAFT的复合键定义的。

使用窗口功能。以下内容为每个文档返回一行,具有最高版本的行,然后为该版本返回最高的草稿:

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;