2013-05-27 4 views
2

Я пытаюсь переписать этот запрос Oracle для SQL Server 2008:Multiple Обновление от Выберите Где Exists в SQL Server 2008

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 запрос должен оставаться таким же, так как запрос будет автоматически составлен независимый от СУБД слой-запрос-запрос.

Я пытался, в частности, следующий синтаксис:

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") 
) 

, но, к сожалению, "UNITS_OF_MEASURE"."UOM_TYPE_ID" и "UNITS_OF_MEASURE"."UOM_CODE" на линии 9-10 не могут быть решены.

ответ

3

В основном это выглядит так, как будто вы сопоставляете производную таблицу с внешней таблицей (целью UPDATE), а не соединяете ее с последней. Это не работает в Transact-SQL (и я также сомневаюсь, что это будет работать в Oracle, по сути).

Однако, вы можете использовать синтаксис UPDATE...FROM: просто избавиться от среднего уровня выбора и использование самого внутреннего выбора в качестве производной таблицы, чтобы присоединиться к UNITS_OF_MEASURE, то есть, как это:

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" и использовать данные производной таблицы для обновления столбцов другой таблицы.

+0

Спасибо! Это работает, на самом деле я нашел одно и то же решение самостоятельно перед вашим сообщением. – Teejay

Смежные вопросы