Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 使用相关子查询更新查询_Sql Server 2008_Tsql - Fatal编程技术网

Sql server 2008 使用相关子查询更新查询

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字

我正在尝试将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

比如:

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语句在几秒钟后返回。似乎尝试合并选择,然后更新可能会更快。再次感谢您的帮助!非常奇怪的问题:)对不起,我帮了大忙。祝你好运