我有两张名为'客户'和'订单'表列名称如下:
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
编辑:示例数据
ID / NAME / ADDRESS /
1 / A / Ad1 /
2 / B / Ad2 /
3 / C / Ad3 /
身份证/人员ID /产品价格/创建日期
ID-1234/1 / Book / $ 5 / 26-2-2017
ID-1235/1 / Book / $ 5 / 26-2-2017
ID-1236/2 /日历/ $ 10 / 4-2-2017
ID-1238/1 / Pen / $ 2 / 1-1-2016
答案 0 :(得分:1)
假设id
中的Orders
列是主键自动增量,则以下内容应该有效:
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将产生最近的购买。理想情况下,您应该有一个时间戳列,用于捕获事务发生的时间。请注意,即使在上面的查询中,我们仍然无法知道何时发生了最近的交易。
答案 1 :(得分:0)
那么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')
表的关键吗?>如果是,则您的架构无法识别“重复”记录。您不能暗示每个客户只允许一个订单,因此如果单个客户有多个订单,我们如何识别重复订单?通过未提及的static hk.o
references ht.a
leaks MainActivity instance
列?
如果有一个'timestamp列,那就是你如何识别dupes,那么就使用它。
hk.o