【问题标题】:SQL Update from a Select从选择中更新 SQL
【发布时间】:2009-12-04 18:40:16
【问题描述】:

我想从其他表的选择中更新表(存储)的两个字段,但我不知道该怎么做。 SQL 系统在 AS/400 中,所以没有 SQL Server 或 Oracle 技巧:(

这里是SELECT,我想要一个订单的价格和数量(文章表加入仅选择现有文章)

SELECT OrderDetails.Price, OrderDetails.Amount
FROM (OrderHeader JOIN OrderDetails ON OrderHeader.Number = OrderDetails.Number)
JOIN Articles ON Article.Reference = OrderDetails.Article
WHERE OrderHeader.Store = '074'
AND   OrderHeader.Date = '2009-12-04'
AND   OrderHeader.Number = 26485

这里是UPDATE,我想从最后一次选择中更新每篇文章的价格和数量

UPDATE Store
SET Store.Price = *****OrderDetails.Price*****
, Store.Amount = Store.Amount + *****OrderDetails.Amount*****
... ????

感谢您的帮助,请原谅我泰山的英语;)

【问题讨论】:

  • 如果商店有多个订单和/或订单有多个详细信息,您如何决定使用哪个值?
  • 好点,汤姆。如果可以修改选择以保证只返回单个值,则答案可以是 udpate 中的子查询。

标签: sql select sql-update ibm-midrange


【解决方案1】:

如果您有驱动程序,您可以通过链接服务器查询执行此更新,即 SQL Server 可以将 AS/400 添加为链接服务器并对文件执行更新,我们有一个带有 DB2 的 AS400,我们通常通过 SQL Server 存储过程进行更新,但您必须先进行选择然后运行更新(这是特定于供应商的 - IBM AS/400 w/DB2 和 SQL 05)

Declare @tmpSql nvarchar(1000);
Declare @baseSql nvarchar(1000);

-- Select 
Set @tmpsql = '''Select * From MyAs400Library.file1 where Field1=''''' + @somevariable + ''''' and Field2='+ @someothervariable + ''''

Set @baseSql = 'Update OpenQuery(LINKEDSERVERNAME,' + @tmpSql + ')'

Set @baseSql = @baseSql + ' SET Field3='''+ @somevariable + ''' where Field1=''' + @somevariable + ''' and Field2='+ @someothervariable + ''

exec sp_executesql @baseSql

所以基本上你是在做一个 SELECT 然后更新......

不知道链接服务器是否适合您,但这是一种方式。

【讨论】:

    【解决方案2】:

    我相信这应该可行:

    UPDATE Store as ST (Price, Amount) = (SELECT OD.Price, ST.Amount + OD.Amount
                                          FROM OrderHeader as OH
                                          JOIN OrderDetails as OD
                                          ON OH.Number = OD.Number
                                          JOIN Articles as A
                                          ON A.Reference = OD.Article
                                          WHERE OH.Store = ST.Store
                                          AND OH.Date = '2009-12-04'
                                          AND OH.Number = 26485)
    WHERE ST.Store = '074'
          AND EXISTS (SELECT '1'
                      FROM OrderHeader as OH
                      JOIN OrderDetails as OD
                      ON OH.Number = OD.Number
                      JOIN Articles as A
                      ON A.Reference = OD.Article
                      WHERE OH.Store = ST.Store
                      AND OH.Date = '2009-12-04'
                      AND OH.Number = 26485)
    

    WHERE EXISTS 是为了防止NULL 结果。我假设 Store 有一个 id 列要匹配。
    这仅在表将为给定的选择标准返回一行(且仅一行)时才有效。如果不是这种情况,您将需要提供更多详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      相关资源
      最近更新 更多