2013-01-12 50 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)