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)