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