Sql 如何联接返回一个结果的子查询?
我需要关于子查询的帮助。。 只是为了简化问题 我有一个客户表(只有唯一的客户) 我有一个销售表(有多个客户条目) 我想退回所有客户,但只显示他们最近购买的商品Sql 如何联接返回一个结果的子查询?,sql,oracle,plsql,Sql,Oracle,Plsql,我需要关于子查询的帮助。。 只是为了简化问题 我有一个客户表(只有唯一的客户) 我有一个销售表(有多个客户条目) 我想退回所有客户,但只显示他们最近购买的商品 John Smith 02/05/2018 Jane Smith 02/10/2018 我想有人使用连接…您可以使用外部应用(Oracle 12c): 或者: WITH cte AS ( SELECT c.*,s.Amount, s.DatePurchase, s.SaleId ROW_NUMBER()
John Smith 02/05/2018
Jane Smith 02/10/2018
我想有人使用连接…您可以使用
外部应用(Oracle 12c)
:
或者:
WITH cte AS (
SELECT c.*,s.Amount, s.DatePurchase, s.SaleId
ROW_NUMBER() OVER(PARTITION BY c.Cust_id ORDER BY s.DatePurchase DESC) AS rn
FROM Cust c
LEFT JOIN Sales s
ON c.Cust_id = s.Cust_id
)
SELECT *
FROM cte
WHERE rn = 1;
我会在这里使用
行号
:
SELECT CustID, CustName, SaleID, DatePurchase, Amount
FROM
(
SELECT c.*, s.SaleID, s.DatePurchase, s.Amount,
ROW_NUMBER() OVER (PARTITION BY c.CustID ORDER BY s.DatePurchase DESC) rn
FROM customer c
LEFT JOIN sales s
ON c.CustID = s.CustID
) t
WHERE t.rn = 1;
请注意,那些根本没有销售记录的客户将报告销售ID、购买日期和金额的
NULL
。如果需要,我们可以使用COALESCE
用占位符替换这些占位符。除了其他答案之外,还有一个选择是使用密集排列
构造
因此,在你的情况下:
select c.CustID, max(s.DatePurchase) keep (dense_rank FIRST order by s.DatePurchase desc)
from customers c
LEFT JOIN sales s on s.CustID = c.CustID
group by c.CustID;
您还可以使用下面的简单子查询
SELECT c.Cust_Name,
s.DatePurchase
FROM customer c
INNER JOIN sales s
INNER JOIN (SELECT Cust_ID,
MAX(DatePurchase) dpur
FROM sales GROUP BY Cust_ID) s1 ON s1.Cust_ID = s.Cust_ID
AND s1.dpur = s.DatePurchase
如果您只需要最新的购买日期,请使用
加入
和分组方式
:
SELECT c.CustName, MAX(s.DatePurchase)
FROM customer c INNER JOIN
sales s
ON c.custid = s.custid
GROUP BY c.custid, c.custname;
select c.CustID, max(s.DatePurchase) keep (dense_rank FIRST order by s.DatePurchase desc)
from customers c
LEFT JOIN sales s on s.CustID = c.CustID
group by c.CustID;
SELECT c.Cust_Name,
s.DatePurchase
FROM customer c
INNER JOIN sales s
INNER JOIN (SELECT Cust_ID,
MAX(DatePurchase) dpur
FROM sales GROUP BY Cust_ID) s1 ON s1.Cust_ID = s.Cust_ID
AND s1.dpur = s.DatePurchase
SELECT c.CustName, MAX(s.DatePurchase)
FROM customer c INNER JOIN
sales s
ON c.custid = s.custid
GROUP BY c.custid, c.custname;