我试图将Foxpro应用程序转换为.NET。作为转换的一部分,我将数据从DBF表转换为Sql服务器。使用相关子查询更新查询
我需要基于订单表,FirstOrder和LastOrder在Customer表中创建一对新字段。
我似乎无法弥补如何在TSql中做到这一点。我知道如何在Foxpro中做到这一点,如果必须,我仍然可以在那里做,但我知道我需要学习如何在Sql中执行此操作。
这里是基本结构。 客户表有一个ID,那么我需要更新的FirstOrder和LastOrder字段。订单表有OrderDate,但这里是实际的曲线。客户ID可存在于订单内的5个不同字段中:ShipperId,PickupId,ConsigneeId,DeliveryId或BillingId。
因此,像:
UPDATE customers
SET FirstOrderDate =
(Select MIN(OrderDate)
FROM Orders o
WHERE o.ShipperId = Customers.Id or
o.PickupId = Customers.Id or
o.ConsigneeId = Customers.Id or
o.DeliveryId = Customers.Id or
o.BillingId = Customers.Id)
似乎无法找出如何与主更新查询扎子查询。
感谢, -sid
编辑: 下面是的工作基础上MarkD的建议的SELECT:
Select C.Id,Min(o.OrderDate) as firstorder, MAX(o.OrderDate) as lastorder
from Customers C
JOIN Orders o
on o.ShipperId = C.Id or
o.PickupId = C.Id or
o.ConsigneeId = C.Id or
o.DeliveryId = C.Id or
o.BillingId = C.Id
GROUP BY C.Id
所以现在我用这个作为一个子查询或光标后回客户表?
SQL Server不喜欢在set命令的聚合函数。它可以作为SELECT使用,我可以获取我正在查找的数据,所以我应该使用该答案并尝试将其用作子查询或游标,然后将更新运行到Customers? – Omegaware
作出更改,请让我知道... – MarkD
马克 - 感谢您的建议。我在寻找订单的最小或最大日期是基于Customer.Id。此Id可以存在于5个Order Id字段中的任何一个中。您的分组依据的是所有ID,因此MinOrderDate会为所有5个ID的组合返回一个最小OrderDate。场景是客户123可以是托运人,也可以是皮卡,也可以是收货人,交货或结算客户。我不在乎哪一个,我只是想要客户123参与的第一个订单。 – Omegaware