【问题标题】:How to fetch the top-n using inline view while performing a join with tables in main query in Oracle / SQL?如何在 Oracle / SQL 的主查询中与表执行联接时使用内联视图获取前 n 个?
【发布时间】:2014-12-18 03:49:48
【问题描述】:

这似乎是一个非常简单的查询,但我一定遗漏了一些明显的东西。我假设这种情况很常见。

我有一个存储产品的表和另一个存储交易的表。交易表有关于销售员的信息。现在,我需要生成一份报告,列出所有产品并包含最后销售该产品的销售人员的 ID。

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

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

这个查询在 a.id 上给了我无效的标识符。

所以在网上搜索后,我尝试在其中添加一个 LATERAL 子句。如下

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

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

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

【问题讨论】:

  • 这可能对您有所帮助:sqlfiddle.com 为您的示例创建一个小提琴。鉴于您正在编写不完整的 sql,当它解决时,为什么不这样做:select top 5 * from () 或限制集合的东西。

标签: sql oracle top-n inline-view


【解决方案1】:
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. 加入表格产品和翻译
  2. 某些产品可能没有交易。由于您需要展示所有需要 LEFT JOIN 的产品
  3. 使用分析函数计算每个产品的每笔交易的订单号(row_number)(每个产品的订单号从 1 开始)

【讨论】:

    【解决方案2】:

    你只需要一个子查询,更像是:

    select p.id, p.product_name, t.salesman_id from products p, trans t 其中 t.product_id = p.product_id 和 t.trans_date = (select max(trans_date) from trans t_in where t_in.product_id = t.product_id)

    【讨论】:

    • 这很好用,但我希望使用 rownum,因为根据我在 ask tom 和 stack overflow 上阅读的内容,它更有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 2022-01-25
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多