基于选择结果的多记录更新

时间:2014-12-17 01:53:42

标签: sql-server sql-server-2008 sqlcommand

这是我在SQL Server 2008中的基本SQL查询:

SELECT userID
FROM coreUsers 
INNER JOIN pluginSales ON coreUser.userID = pluginSales.userID
WHERE (coreUser.CurrentYear = '2014') 
  AND (pluginSales.PaidShipping = 'Yes') 
   OR (coreUser.IsContract = 'Yes')

刚刚在2014年12月19日进行了测试,这会返回61个结果。

我需要能够为上述语句产生的所有记录更新pluginSales表格列ShipppingDate

coreUser.userID是我自动增加的唯一键。

pluginSales有一列ShippingDate,如果记录设置为2014(varchar),我需要更新'12/16/2014'标准coreUser.CurrentYear他们是PaidShipping(pluginSales.PaidShipping)或者如果他们是签约客户(coreUser.IsContract

编辑#1

我尝试了以下内容......

UPDATE       pluginSales
SET                ShippingDate = ''
FROM            coreUsers AS cu INNER JOIN
                         pluginSales AS pis ON cu.userID = pis.userID CROSS JOIN
                         pluginSales
WHERE (cu.CurrentYear = '2014') AND (pis.PaidShipping = 'Yes' OR pis.IsContract = 'Yes')

刚刚在2014年12月19日再次测试了这条修改过的554条记录(我的整个pluginSales数据库)

这影响了我的行的ALLLLLL,而不仅仅是具体的行。请指教。

2 个答案:

答案 0 :(得分:3)

您可以使用updatejoin

执行此操作
UPDATE cu
    SET ShippingDate '12/16/2014'
FROM coreUsers cu INNER JOIN
     pluginSales pis
     ON cu.userID = pis.userID
WHERE (cu.CurrentYear = '2014' AND (pis.PaidShipping = 'Yes') OR (pis.IsContract = 'Yes');

您可能真的想要这个where子句:

WHERE (cu.CurrentYear = '2014') AND (pis.PaidShipping = 'Yes' OR pis.IsContract = 'Yes');

请注意,您不应该将日期存储在字符串中。相反,您应该使用原生datedatetime类型。如果必须将日期存储为字符串,则应使用YYYY-MM-DD格式,因此order by和比较等操作将对值进行处理。

答案 1 :(得分:1)

首先运行选择

SELECT *
FROM pluginSales PS
INNER JOIN coreUsers CU ON CU.userID = PS.userID
WHERE (CU.CurrentYear = '2014')
    AND (PS.PaidShipping = 'Yes')
    OR (CU.IsContract = 'Yes')

然后只将第一行更改为UPDATE ...

UPDATE pluginSales SET ShippingDate = '12/16/2014'
FROM pluginSales PS
INNER JOIN coreUsers CU ON CU.userID = PS.userID
WHERE (CU.CurrentYear = '2014')
    AND (PS.PaidShipping = 'Yes')
    OR (CU.IsContract = 'Yes')

您的Where子句有OR。您可能希望使用括号()明确分组。