SQL LEFT JOIN - 内部选择不返回列

时间:2017-02-26 03:26:00

标签: sql sql-server

我有两张名为'客户'和'订单'表列名称如下:

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

2 个答案:

答案 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