[英]SQL LEFT JOIN - Inner select not returning columns
我有两个表,分别称为“客户”和“订单”。 表的列名称如下:
Customers: id, name, address
Orders: id, person_id, product, price
理想的结果是向所有客户查询其最新购买的商品之一。 我在“订单”表中有很多重复项,由于某些错误,两条记录具有相同的时间戳。
我已经编写了以下代码,但问题是查询不返回表2(Orders)列值。 谁能告诉我这个问题是什么?
SELECT C.Id,C.Name, O.item, O.price, O.product
FROM Customers C
LEFT JOIN
(
SELECT TOP 1 person_id
FROM Orders
WHERE status = 'Pending'
) O ON C.ID = O.person_id
Results: O.item, O.price, O.product values are all null
编辑:样本数据
身份证/姓名/地址/
1 / A /广告1
2 / B / Ad2 /
3 / C / Ad3 /
ID /人员ID /产品价格/创建日期
ID-1234 / 1 /书本/ $ 5 / 26-2-2017
ID-1235 / 1 /书本/ $ 5 / 26-2-2017
ID-1236 / 2 /日历/ $ 10 / 4-2-2017
ID-1238 / 1 /笔/ $ 2/2016年1月1日
假设“ Orders
中的id
列是主键自动递增,则应执行以下操作:
SELECT c.id,
c.name,
COALESCE(t1.price, 0.0) AS price,
COALESCE(t1.product, 'NA') AS product
FROM Customers c
LEFT JOIN Orders t1
ON c.id = t1.person_id
LEFT JOIN
(
SELECT person_id, MAX(CAST(SUBSTRING(id, 4, LEN(id)) AS INT)) AS max_id
FROM Orders
GROUP BY person_id
) t2
ON t1.person_id = t2.person_id AND
t2.max_id = CAST(SUBSTRING(t1.id, 4, LEN(t1.id)) AS INT)
该答案假设采用每个客户的最大订单ID将产生最近的购买。 理想情况下,您应该有一个timestamp列,该列捕获事务发生的时间。 需要注意的是,即使在上面的查询,我们仍然不知道当最近交易发生的方式。
那么timestamp
列在哪里? 您的表架构中未提及。 但是您的描述也没有提到status
栏,并且显然在其中。
orders.id
是否唯一? 它是Orders
表的键吗?>如果是,则您的架构无法识别“重复”记录。 您不能表示每位客户只允许一个订单,因此如果单个客户有多个订单,我们如何识别重复的订单? 通过未提及的timestamp
列?
如果有一个“时间戳记”列,这就是您识别重复项的方式,请使用它。
SELECT C.Id,C.Name, O.item, O.price, O.product
FROM Customers C LEFT JOIN Orders o
on o.id = (Select Min(id) from orders
where person_id = c.Id
and timestamp = o.timestamp
and status = 'Pending')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.