我正在尝试重写SQL Server 2008的Oracle查询:
UPDATE "LOAD"."UNITS_OF_MEASURE"
SET ("UOM_DESC", "UOM_SYMBOL", "UOM_MUL_FACTOR", "UOM_ADD_FACTOR", "UOM_DEC_PLACE", "UOM_REFERENCE", "UOM_SUBTYPE_ID") =
( SELECT "UOM_DESC", "UOM_SYMBOL", "UOM_MUL_FACTOR", "UOM_ADD_FACTOR", "UOM_DEC_PLACE", 0 AS "UOM_REFERENCE", NULL AS "UOM_SUBTYPE_ID"
FROM ( SELECT DISTINCT "UOM_TYPE_ID", "UOM_CODE", "UOM_DESC", "UOM_SYMBOL", "UOM_MUL_FACTOR", "UOM_ADD_FACTOR", "UOM_DEC_PLACE"
FROM "LOAD"."LOADER_UNITS_OF_MEASURE"
INNER JOIN "LOAD"."UOM_TYPES" ON ("UOM_TYPES"."UOM_TYPE_CODE"="LOADER_UNITS_OF_MEASURE"."UOM_TYPE_CODE")
) SELECTION
WHERE ("SELECTION"."UOM_TYPE_ID"="UNITS_OF_MEASURE"."UOM_TYPE_ID")
AND ("SELECTION"."UOM_CODE"="UNITS_OF_MEASURE"."UOM_CODE")
)
WHERE EXISTS ( SELECT "UOM_DESC", "UOM_SYMBOL", "UOM_MUL_FACTOR", "UOM_ADD_FACTOR", "UOM_DEC_PLACE", 0 AS "UOM_REFERENCE", NULL AS "UOM_SUBTYPE_ID"
FROM ( SELECT DISTINCT "UOM_TYPE_ID", "UOM_CODE", "UOM_DESC", "UOM_SYMBOL", "UOM_MUL_FACTOR", "UOM_ADD_FACTOR", "UOM_DEC_PLACE"
FROM "LOAD"."LOADER_UNITS_OF_MEASURE"
INNER JOIN "LOAD"."UOM_TYPES" ON ("UOM_TYPES"."UOM_TYPE_CODE"="LOADER_UNITS_OF_MEASURE"."UOM_TYPE_CODE")
) SELECTION
WHERE ("SELECTION"."UOM_TYPE_ID"="UNITS_OF_MEASURE"."UOM_TYPE_ID")
AND ("SELECTION"."UOM_CODE"="UNITS_OF_MEASURE"."UOM_CODE")
)
内部SELECT
查询应该保持不变,因为查询是由DBMS独立的查询构建器层自动组成的。
我尝试了以下语法:
UPDATE "LOAD"."UNITS_OF_MEASURE"
SET "UOM_DESC" = i."UOM_DESC", "UOM_SYMBOL" = i."UOM_SYMBOL", "UOM_MUL_FACTOR" = i."UOM_MUL_FACTOR", "UOM_ADD_FACTOR" = i."UOM_ADD_FACTOR", "UOM_DEC_PLACE" = i."UOM_DEC_PLACE",
"UOM_REFERENCE" = 0, "UOM_SUBTYPE_ID" = NULL FROM
( SELECT "UOM_DESC", "UOM_SYMBOL", "UOM_MUL_FACTOR", "UOM_ADD_FACTOR", "UOM_DEC_PLACE", 0 AS "UOM_REFERENCE", NULL AS "UOM_SUBTYPE_ID"
FROM ( SELECT DISTINCT "UOM_TYPE_ID", "UOM_CODE", "UOM_DESC", "UOM_SYMBOL", "UOM_MUL_FACTOR", "UOM_ADD_FACTOR", "UOM_DEC_PLACE"
FROM "LOAD"."LOADER_UNITS_OF_MEASURE"
INNER JOIN "LOAD"."UOM_TYPES" ON ("UOM_TYPES"."UOM_TYPE_CODE"="LOADER_UNITS_OF_MEASURE"."UOM_TYPE_CODE")
) SELECTION
WHERE ("SELECTION"."UOM_TYPE_ID"="UNITS_OF_MEASURE"."UOM_TYPE_ID")
AND ("SELECTION"."UOM_CODE"="UNITS_OF_MEASURE"."UOM_CODE")
)i
WHERE EXISTS ( SELECT "UOM_DESC", "UOM_SYMBOL", "UOM_MUL_FACTOR", "UOM_ADD_FACTOR", "UOM_DEC_PLACE", 0 AS "UOM_REFERENCE", NULL AS "UOM_SUBTYPE_ID"
FROM ( SELECT DISTINCT "UOM_TYPE_ID", "UOM_CODE", "UOM_DESC", "UOM_SYMBOL", "UOM_MUL_FACTOR", "UOM_ADD_FACTOR", "UOM_DEC_PLACE"
FROM "LOAD"."LOADER_UNITS_OF_MEASURE"
INNER JOIN "LOAD"."UOM_TYPES" ON ("UOM_TYPES"."UOM_TYPE_CODE"="LOADER_UNITS_OF_MEASURE"."UOM_TYPE_CODE")
) SELECTION
WHERE ("SELECTION"."UOM_TYPE_ID"="UNITS_OF_MEASURE"."UOM_TYPE_ID")
AND ("SELECTION"."UOM_CODE"="UNITS_OF_MEASURE"."UOM_CODE")
)
但遗憾的是,第9-10行的"UNITS_OF_MEASURE"."UOM_TYPE_ID"
和"UNITS_OF_MEASURE"."UOM_CODE"
无法解析。
答案 0 :(得分:3)
基本上,这看起来好像是将派生表与外部表(UPDATE的目标)相关联,而不是将其连接到后者。这在Transact-SQL中不起作用(我也怀疑这是否适用于Oracle,事实上)。
但是,您可以使用UPDATE...FROM
语法:只需删除中间层SELECT并使用最内层的SELECT作为派生表加入UNITS_OF_MEASURE
,即如下所示:< / p>
UPDATE "LOAD"."UNITS_OF_MEASURE"
SET "UOM_DESC" = "SELECTION"."UOM_DESC",
"UOM_SYMBOL" = "SELECTION"."UOM_SYMBOL",
"UOM_MUL_FACTOR" = "SELECTION"."UOM_MUL_FACTOR",
"UOM_ADD_FACTOR" = "SELECTION"."UOM_ADD_FACTOR",
"UOM_DEC_PLACE" = "SELECTION"."UOM_DEC_PLACE",
"UOM_REFERENCE" = 0,
"UOM_SUBTYPE_ID" = NULL
FROM ( SELECT DISTINCT "UOM_TYPE_ID", "UOM_CODE", "UOM_DESC", "UOM_SYMBOL",
"UOM_MUL_FACTOR", "UOM_ADD_FACTOR", "UOM_DEC_PLACE"
FROM "LOAD"."LOADER_UNITS_OF_MEASURE"
INNER JOIN "LOAD"."UOM_TYPES" ON ("UOM_TYPES"."UOM_TYPE_CODE"="LOADER_UNITS_OF_MEASURE"."UOM_TYPE_CODE")
) SELECTION
WHERE ("SELECTION"."UOM_TYPE_ID"="UNITS_OF_MEASURE"."UOM_TYPE_ID")
AND ("SELECTION"."UOM_CODE"="UNITS_OF_MEASURE"."UOM_CODE")
;
这会将SELECTION
派生表加入"LOAD"."UNITS_OF_MEASURE"
并使用派生表的数据来更新其他表的列。