2

我正在尝试编写 SQL 语句,但不断收到错误...

这是我的情况:

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

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

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

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

我在销售订单表中添加了一个字段“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

现在我需要将 transref 代码放入销售订单表中,使其看起来像这样:

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

4 回答 4

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;
于 2012-09-26T17:12:28.410 回答
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 
于 2012-09-26T14:51:25.037 回答
0

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

于 2014-02-10T19:56:12.073 回答
0

您遇到这个问题是因为 DB2 不允许您使用JOIN带有简单UPDATE语句的 a(它的许多看似任意的限制之一)。

在 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;
于 2012-09-26T15:48:28.480 回答