1

我正在尝试将 Foxpro 应用程序转换为 .NET。作为该转换的一部分,我将数据从 DBF 表转换为 Sql 服务器。

我需要根据 Orders 表 FirstOrder 和 LastOrder 在 Customer 表中提出几个新字段。

我似乎无法在 TSql 中搞清楚如何做到这一点。我知道我会如何在 Foxpro 中做到这一点,如果必须的话,我实际上仍然可以在那里做到,但我知道我需要学习如何在 Sql 中做到这一点。

这里是基本结构。客户表有一个 Id,然后是我需要更新的 FirstOrder 和 LastOrder 字段。Order Table 有 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)

只是似乎无法找出如何将子查询与主更新查询联系起来。

谢谢,-席德


编辑:这是根据 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

那么现在我应该将其用作子查询或游标来回发到客户表吗?

4

2 回答 2

2

虽然我认为JOIN标准不太可能,但看起来你正在尝试这样做?

编辑:我已经修改了JOIN标准,但这就是你所追求的。 'dGrouping By列是奇数。OR

;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这就是您的查询与s 的样子

;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 

编辑:虽然我很难找到你发布的语法的错误。

于 2013-01-12T16:15:24.843 回答
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)
于 2015-07-05T09:22:12.710 回答