Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何联接返回一个结果的子查询?_Sql_Oracle_Plsql - Fatal编程技术网

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;