Sql server 如何在SQL中为每个客户获取一行,包括订单的第一行
我有两张桌子——顾客和订单。每个客户将有1..n个订单。它们与Orders表中的Customers表有外键关系。到目前为止,数据库101Sql server 如何在SQL中为每个客户获取一行,包括订单的第一行,sql-server,Sql Server,我有两张桌子——顾客和订单。每个客户将有1..n个订单。它们与Orders表中的Customers表有外键关系。到目前为止,数据库101 我需要一个查询,该查询将返回每个客户的单行,以及该客户最新订单的日期和订单ID。所有客户至少有一个订单。我可以很容易地用函数实现这一点,但我更喜欢用SQL实现。对于自动递增的ID-s,并且与日期没有差异的情况,解决方案很简单: SELECT c.*, o.* FROM Customer c JOIN (SELECT max(id) as order_id,
我需要一个查询,该查询将返回每个客户的单行,以及该客户最新订单的日期和订单ID。所有客户至少有一个订单。我可以很容易地用函数实现这一点,但我更喜欢用SQL实现。对于自动递增的ID-s,并且与日期没有差异的情况,解决方案很简单:
SELECT c.*, o.*
FROM Customer c
JOIN (SELECT max(id) as order_id, customer_id
FROM Order GROUP BY curtomer_id) conn on c.id = conn.customer_id
JOIN Order o on o.id = conn.order_id
你没有说明你的数据库管理系统,所以我假设一个符合ANSI标准的引擎
select *
from (
SELECT c.*,
o.*,
row_number() over (partition by o.customer_id order by order_date desc) as rn
FROM Customer c
JOIN Order o on o.customer_id = c.id
)
where rn = 1
查看
JOIN
但是,在您的情况下,我会创建第三个表<代码>客户订单。在此表中,您将客户id与不同的订单id链接。每条记录都会显示到orders表中订单的链接。这使得做这些事情容易得多。可以找到一个很好的解释,这种技术称为规范化。如果一个订单可能属于多个客户,则需要建议的customer_orders表。由于Customer和Orders之间存在1..n关系,Orders表中的FKCustomerID键就足够了。