如何在Oracle/SQL中与主查询中的表执行联接时使用内联视图获取top-n



这看起来是一个非常简单的查询,但我一定遗漏了一些明显的内容。我认为这种情况很常见。

我有一张存储产品的表和另一张存储交易的表。交易表包含有关销售人员的信息。现在,我需要制作一份报告,列出所有产品,并包括上次销售该产品的销售人员的id。

我尝试了一个简单的查询,比如:

选择id,product_name,(从中选择salesman_id(选择salesman_id来自trans其中product_id=a.id按trans_date desc排序)其中rownum=1)salesman_id来自的产品

此查询在.id.上给了我无效的标识符

所以在搜索完网络后,我试图在其中添加一个LATERAL子句

选择id,product_name,salesman_id从产品a,LATERAL(从中选择salesman_id(选择salesman_id来自trans其中product_id=a.id按trans_date desc排序)其中rownum=1)

但是这个查询给了我不完整的SQL语句。

有没有一种简单的方法可以在单个查询中实现这一点?

select id, product_name, salesman_id from
(select p.id, p.product_name, t.salesman_id, row_number() over(partition by p.id order by t.trans_date desc) rw
  from products p left join trans t on t.product_id = p.id
) where rw = 1;
  1. 联接表产品和trans
  2. 某些产品可能没有交易。由于您需要展示所有产品,因此需要LEFT JOIN
  3. 使用分析函数计算每个产品的每笔交易的订单号(row_number)(每个产品的订单号从1开始)

您只需要一个子查询,类似于:

从产品p、trans t中选择p.id、p.product_name、t.salesman_id其中t.product_id=p.product_id并且t.trans_date=(从trans_in中选择max(trans_date),其中t_in.product_id=t.product_id)

相关内容

  • 没有找到相关文章