SQL左联接-内部选择不返回列
我有两张桌子叫“顾客”和“订单”。表列名称如下所示:SQL左联接-内部选择不返回列,sql,sql-server,Sql,Sql Server,我有两张桌子叫“顾客”和“订单”。表列名称如下所示: Customers: id, name, address Orders: id, person_id, product, price 理想的结果是查询所有客户的最新购买情况。我在“Orders”表中有很多重复项,其中两条记录由于某些错误而具有相同的时间戳 我已经编写了以下代码,但问题是查询不返回表2(订单)列值。有人能告诉我问题出在哪里吗 编辑:样本数据 ID/姓名/地址/ 1/A/Ad1/ 2/B/Ad2/ 3/C/Ad3/ ID/
Customers: id, name, address
Orders: id, person_id, product, price
理想的结果是查询所有客户的最新购买情况。我在“Orders”表中有很多重复项,其中两条记录由于某些错误而具有相同的时间戳
我已经编写了以下代码,但问题是查询不返回表2(订单)列值。有人能告诉我问题出在哪里吗
编辑:样本数据 ID/姓名/地址/
1/A/Ad1/
2/B/Ad2/
3/C/Ad3/
ID/人员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
那么
时间戳列在哪里?表架构中没有提到它。但是您的描述也没有提到状态
列,这一点很明显就在那里。
订单id是否唯一?它是订单
表的键吗?>如果是,则您的模式无法识别“重复”记录。您不能暗示每个客户只允许一个订单,因此如果一个客户有多个订单,我们如何识别重复订单?通过未提及的时间戳
列
如果有一个“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')
假设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将产生最近的购买。理想情况下,您应该有一个时间戳列,用于捕获事务发生的时间。请注意,即使在上面的查询中,我们仍然无法知道最近的事务是何时发生的。MySQL不支持TOP
。你确定你使用的是mysql吗?我使用的是SQL。Orders.ID
列实际上包含什么?它是以文本形式包含数字,还是其他形式?timestam是我在这里没有提到的“createdate”列。我无法识别重复项,因为除了订单表中的ID之外,它们是相同的。由于ID列是一个文本字符串,我可以使用最小值/最大值作为文本字符串。谢谢。第二个连接是“左连接”还是“连接”?当我尝试“左加入”时,出现密钥冲突错误。当我尝试加入时,表1中没有任何订单的记录丢失。您从未回答过我的问题。Orders.ID
列中存储了什么?数字作为文本,还是其他什么?对不起。Order.id是文本字符串。@是的,但它是数字还是其他东西?它是数字和字符的组合。如;ID-1234
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')
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)