我正在尝试编写一个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
但到目前为止没有任何工作。在尝试了十几个教程和答案之后,有人可以帮我解开我脑中的结吗?
答案 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中。