【问题标题】:how do i take the results of my subqueries to join with another table?我如何将我的子查询的结果加入另一个表?
【发布时间】:2026-01-16 14:50:01
【问题描述】:

。试图将借阅者、书籍和作者的结果链接在一起。

想要的结果:

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

但我不确定如何链接返回的*作者来检索作者名字和姓氏,但我没有在子查询中提到作者表

【问题讨论】:

  • 样本数据和期望的结果会使问题更容易理解。
  • borrowdate 列的数据类型是什么:是date 还是某种字符串?
  • borrowdate 被格式化为字符串类型 - varchar2
  • @GordonLinoff 欢呼——我试图让我的问题更容易理解。感谢反馈

标签: sql oracle join subquery analytic-functions


【解决方案1】:

所以,如果我理解正确,你想做这样的事情:

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

【讨论】:

  • 天哪!是的!像这样的东西,但不确定如何格式化它以显示结果。这比我想的要整洁得多!一直在试图搞砸,但也许在 SQL 方面还是太糟糕了。呸。感谢您的帮助
【解决方案2】:

您可以在子查询中将这三个表与rank() 分析函数按降序连接count,然后在主查询中取小于等于五个:

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

如果您使用的是 DB 版本 12c+,则更容易获取它们:

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

我使用br.borrowdate between date'2017-01-01' and date'2017-12-31' 而不是to_char(br.borrowdate) like '%2017' 以便能够使borrowdate 列上的索引受益(如果存在)。

上面的那些查询返回带有关系的行,例如如果多行与第 5 行的值匹配,则它们带来的行数超过 5 行。

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

【讨论】:

    最近更新 更多