2013-01-12 53 views
1

我试图将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 

所以现在我用这个作为一个子查询或光标后回客户表?

回答

2

虽然我认为JOIN标准是不太可能的,它看起来像你试图做到这一点?

编辑:我修改了JOIN条件,但这是你之后。 Grouping By列为OR'd是奇数。

;WITH MinOrderDates AS 
(
    SELECT CustID 
      ,OrderDate = MIN(OrderDate) 
    FROM Orders 
    GROUP BY CustID 
) 

UPDATE C 
SET FirstOrderDate = MIN(O.OrderDate) 
FROM Customers  C 
JOIN MinOrderDates O ON C.Id = O.CustID 

这是您的查询将是什么样子与OR小号

;WITH MinOrderDates AS 
(
    SELECT ShipperId 
      ,PickupId 
      ,ConsigneeId 
      ,DeliveryId 
      .BillingId 
      ,OrderDate = MIN(OrderDate) 
    FROM Orders 
    GROUP BY ShipperId 
      ,PickupId 
      ,ConsigneeId 
      ,DeliveryId 
      .BillingId 
) 

UPDATE C 
SET FirstOrderDate = MIN(O.OrderDate) 
FROM Customers  C 
JOIN MinOrderDates 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 

编辑:虽然我有一个很难找到故障与您发布的语法。

+0

SQL Server不喜欢在set命令的聚合函数。它可以作为SELECT使用,我可以获取我正在查找的数据,所以我应该使用该答案并尝试将其用作子查询或游标,然后将更新运行到Customers? – Omegaware

+0

作出更改,请让我知道... – MarkD

+0

马克 - 感谢您的建议。我在寻找订单的最小或最大日期是基于Customer.Id。此Id可以存在于5个Order Id字段中的任何一个中。您的分组依据的是所有ID,因此MinOrderDate会为所有5个ID的组合返回一个最小OrderDate。场景是客户123可以是托运人,也可以是皮卡,也可以是收货人,交货或结算客户。我不在乎哪一个,我只是想要客户123参与的第一个订单。 – Omegaware

0

试试这个

UPDATE customers 
SET FirstOrderDate = 
(Select MIN(OrderDate) 
FROM Orders 
WHERE ShipperId = Customers.Id or 
PickupId = Customers.Id or 
ConsigneeId = Customers.Id or 
DeliveryId = Customers.Id or 
BillingId = Customers.Id)