使用JOIN更新表

时间:2012-09-26 14:46:33

标签: sql join db2 ibm-midrange

我正在尝试编写一个SQL语句,但一直收到错误......

以下是我的情况:

我有一张包含销售订单的表格和一张包含物品转移的表格。

销售订单具有订单号和扩展名,其中ID本身可能不是唯一的,但订单号和扩展名的组合是。扩展名可以为null。

项目转移表有一个参考编号,有时还有一个销售订单编号加上扩展名,但并非总是如此。

原因是有时会出于销售订单而转移商品,有时会出于其他原因。此外,销售订单可以在没有首先转移项目的情况下发生。一个订单只能进行一次转账,反之亦然。

我在销售订单表中添加了一个字段“transref”,因此订单可以连接到转移(如果适用)。 (由于性能原因,无法动态计算此信息。)所以我的表现在看起来像这样(它们实际上更大但这是重要的信息):

SALESORDERS
ORDERNO ORDEXT TRANSREF
1       (null) (null)
2       (null) (null)
2       a      (null)
3       (null) (null)

TRANSFERS
TRANSREF ORDERNO ORDEXT 
t1       1       (null)
t2       (null)  (null)
t3       2       a

现在我需要将转换代码放入销售订单表中,以便它看起来像这样:

SALESORDERS
ORDERNO ORDEXT TRANSREF
1       (null) t1
2       (null) (null)
2       a      t3
3       (null) (null)

我尝试了各种各样的陈述,例如

UPDATE SALESORDERS 
INNER JOIN TRANSFERS 
ON SALESORDERS.ORDERNO = TRANSFERS.ORDERNO and (SALESORDERS.ORDEXT = TRANSFERS.ORDEXT or (SALESORDERS.ORDEXT is null and TRANSFERS.ORDEXT is null))
SET SALESORDERS.TRANSREF = TRANSFERS.TRANSREF 
WHERE TRANSFERS.ORDERNO IS NOT NULL

但到目前为止没有任何工作。在尝试了十几个教程和答案之后,有人可以帮我解开我脑中的结吗?

4 个答案:

答案 0 :(得分:3)

由于您多次将其称为AS / 400,我将假设您使用的是旧版本的操作系统。您可能需要相关的子选择。类似的东西:

update salesorders o
set transref = (select t.transref 
  from transfers t
  where o.orderno = t.orderno
    and (o.ordext = t.ordext or (t.ordext=null and o.ordext=null))
    and t.transref <> null)
where ordext = null;

答案 1 :(得分:2)

此语法完全取决于各种SQL

例如,这可能有用(SQL Server)

UPDATE SALESORDERS  
SET SALESORDERS.TRANSREF = TRANSFERS.TRANSREF  
FROM
SALESORDERS  
INNER JOIN TRANSFERS  
ON SALESORDERS.ORDERNO = TRANSFERS.ORDERNO and (SALESORDERS.ORDEXT = TRANSFERS.ORDEXT or (SALESORDERS.ORDEXT is null and TRANSFERS.ORDEXT is null)) 
WHERE TRANSFERS.ORDERNO IS NOT NULL 

答案 2 :(得分:0)

您遇到此问题是因为DB2不允许您使用JOIN语句(简单UPDATE语句(其中许多看似任意的限制之一)。

在DB2中执行此操作的最佳方法是使用MERGE。这样的事情应该有效:

merge into salesorders
    using transfers
    on transfers.orderno = salesorders.orderno and (
           transfers.ordtext = salesorders.ordtext or (
               transfers.ordtext is null and 
               salesorders.ordtext is null
           )
       )
    when matched then update set
        salesorders.transref = transfers.transref;

答案 3 :(得分:0)

MERGE可以正常工作,无论是嵌入在SQLRPGLE中还是嵌入在交互式STRSQL中。