0

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

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

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

select id, product_name, (select salesman_id from (select salesman_id from trans where product_id = a.id order by trans_date desc) where rownum = 1) salesman_id from products a

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

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

select id, product_name, salesman_id from products a, LATERAL(select salesman_id from (select salesman_id from trans where product_id = a.id order by trans_date desc) where rownum = 1)

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

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

4

2 回答 2

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开始)
于 2014-10-22T16:04:43.930 回答
0

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

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

于 2014-10-22T16:09:07.767 回答