Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQL中为每个客户获取一行,包括订单的第一行_Sql Server - Fatal编程技术网

Sql server 如何在SQL中为每个客户获取一行,包括订单的第一行

Sql 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,

我有两张桌子——顾客和订单。每个客户将有1..n个订单。它们与Orders表中的Customers表有外键关系。到目前为止,数据库101


我需要一个查询,该查询将返回每个客户的单行,以及该客户最新订单的日期和订单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键就足够了。