Sql 如何将子查询的结果与另一个表联接?

Sql 如何将子查询的结果与另一个表联接?,sql,oracle,join,subquery,analytic-functions,Sql,Oracle,Join,Subquery,Analytic Functions,。试图将借阅者、书籍和作者的结果联系起来 预期结果: AUTHORID AUTHORFIRSTNAME AUTHORLASTNAME 1 JIM SPARKS 2 JAMES ALLEN 3 MARCUS RASHFORD 20

。试图将借阅者、书籍和作者的结果联系起来

预期结果:

AUTHORID         AUTHORFIRSTNAME      AUTHORLASTNAME
1                     JIM                   SPARKS
2                     JAMES                 ALLEN
3                     MARCUS                RASHFORD
20                    PAUL                  POGBA
22                    THIERRY               HENRY

但我不确定如何链接返回的顶级authorids以检索authorfirstname和lastname,但我没有在子查询中提到author表,因此,如果我正确获得它,您希望执行以下操作:

select authorid, authorfirstname, authorlastname 
 from 
  (select a.authorid, a.authorfirstname, a.authorlastname 
   from author a, borrower b, book c 
   where a.authorid = c.authorid and c.bookid = b.bookid
   and b.borrowdate like '%2017' 
    group by c.bookauthor 
    order by count(*) desc) xx 
 where rownum <=5

您可以将这三个表与秩分析函数按降序联接,以便在子查询中计数,然后在主查询中取小于等于5的值:

SELECT authorid, authorfirstname, authorlastname
  FROM
  (
  SELECT a.authorid, a.authorfirstname, a.authorlastname, 
         rank() over (order by count(*) desc)  as rnk
    FROM AUTHOR a
    LEFT JOIN BOOK bk ON a.authorid = bk.authorid
    LEFT JOIN BORROWER br ON br.bookid = bk.bookid
   WHERE br.borrowdate between date'2017-01-01' and date'2017-12-31'
   GROUP BY a.authorid, a.authorfirstname, a.authorlastname
   )
  WHERE rnk <= 5
  ORDER BY rnk
其中,我在日期“2017-01-01”和日期“2017-12-31”之间使用了br.borrowdate,而不是像“%2017”这样的charbr.borrowdate,以便能够受益于borrowdate列上的索引(如果存在)

上面的这些查询返回的行是有联系的,例如,如果多行与第5行的值匹配,则它们会带来多于5行的行


不要使用rownum伪列进行排名,因为它的值是在排序之前计算的,可能会产生错误的结果。

示例数据和期望的结果会使问题更容易理解。什么是borrowdate列的数据类型:是日期还是某种字符串?borrowdate的格式为字符串类型-varchar2@GordonLinoff干杯-我试图让我的这个问题更容易理解。感谢你的反馈哦,天哪!对类似于此,但不确定如何格式化以显示结果。这比我想象的要整洁得多!一直在试图搞乱,但可能SQL还是太差了。吼叫声谢谢你的帮助
SELECT a.authorid, a.authorfirstname, a.authorlastname, 
       rank() over (order by count(*) desc)  as rnk
  FROM AUTHOR a
  LEFT JOIN BOOK bk ON a.authorid = bk.authorid
  LEFT JOIN BORROWER br ON br.bookid = bk.bookid
 WHERE br.borrowdate between date'2017-01-01' and date'2017-12-31'
 GROUP BY a.authorid, a.authorfirstname, a.authorlastname
 ORDER BY rnk 
 FETCH FIRST 5 ROWS WITH TIES