Sql server 2008 使用相关子查询更新查询
我正在尝试将Foxpro应用程序转换为.NET。作为转换的一部分,我将数据从DBF表转换到Sql server 我需要根据Orders表FirstOrder和LastOrder在Customer表中创建两个新字段 在TSql中,我似乎无法应付如何做到这一点。我知道我在Foxpro中是如何做到这一点的,如果有必要的话,我仍然可以在Foxpro中做到这一点,但我知道我需要学习如何在Sql中做到这一点 这是基本结构。 Customer表有一个Id,然后需要更新FirstOrder和LastOrder字段。 Order表有OrderDate,但这里是实际曲线。客户Id可以存在于订单中的5个不同字段中:ShipperId、PickupId、收货人Id、DeliveryId或BillingId 比如:Sql server 2008 使用相关子查询更新查询,sql-server-2008,tsql,Sql Server 2008,Tsql,我正在尝试将Foxpro应用程序转换为.NET。作为转换的一部分,我将数据从DBF表转换到Sql server 我需要根据Orders表FirstOrder和LastOrder在Customer表中创建两个新字段 在TSql中,我似乎无法应付如何做到这一点。我知道我在Foxpro中是如何做到这一点的,如果有必要的话,我仍然可以在Foxpro中做到这一点,但我知道我需要学习如何在Sql中做到这一点 这是基本结构。 Customer表有一个Id,然后需要更新FirstOrder和LastOrder字
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 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
那么现在我是否要将其用作子查询或游标以发回Customers表?虽然我认为
连接条件不太可能,但看起来您正在尝试这样做
编辑:我已经修改了加入
标准,但这正是你想要的。
按或'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
这就是使用或
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
编辑:尽管我很难找到你所发布语法的错误。试试这个
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)
Sql server不喜欢set命令中的聚合函数。它确实可以作为一个选择,我可以得到我正在寻找的数据,所以我应该使用这个答案,并尝试使用它作为子查询或光标,然后运行更新到客户?马克-谢谢你的建议。我从订单中查找的最小或最大日期基于Customer.Id。此Id可以存在于5个订单Id字段中的任何一个字段中。您的分组依据基于所有Id,因此MinOrderDate会为所有5个Id的组合返回一个MinOrderDate。场景是,客户123可以是发货人,也可以是提货人,或者可以是收货人,或者是送货人,或者是计费客户。我不管是哪一个,我只想要涉及123号顾客的第一份订单。马克,你说得对。我的帖子确实有正确的语法!由于某种原因,当我试图在查询窗口中运行它时,我一定是输入错误。当你对语法的掌握没有信心时,这就是问题所在!!!!嗯,我一定在学点什么。现在唯一的问题是它需要一分钟才能运行,select语句在几秒钟后返回。似乎尝试合并选择,然后更新可能会更快。再次感谢您的帮助!非常奇怪的问题:)对不起,我帮了大忙。祝你好运