2015-02-09 3 views
1

Я пытаюсь выполнить то, что я считаю, очень простой случай для обновления SQL для двух различных столбца, основываясь на выборе:SQL Case Update для двух различных колонок на основе выбор

PROD_TB:

Product_Code Reg_Price  Sale_Price 
    A   1000   2000 

PRICE_TB:

Product_Code Type Price 
    A   REG  3000 
    A   SALE 4000 

Желаемый результат обновления:

PROD_TB:

Product_Code Reg_Price  Sale_Price 
    A   3000   4000 

То, что я пытался:

UPDATE PROD_TB 
SET Reg_Price = CASE 
        WHEN PRICE_TB.Type = 'REG' 
        THEN PRICE_TB.Price 
        ELSE Reg_Price 
       END, 
    Sale_Price = CASE 
        WHEN PRICE_TB.Type = 'SALE' 
         THEN PRICE_TB.Price 
         ELSE Sale_Price 
       END 
FROM 
    PROD_TB 
JOIN 
    PRICE_TB ON PROD_TB.PRODUCT_CODE = PRICE_TB.PRODUCT_CODE 

Запуск выше SQL обновляет только обычная цена, а не цена продажи. Не поддерживает ли SQL эти запросы обновления? Или я сделал элементарную ошибку?

+0

Вы должны удалить вторую 'set' и использовать' , 'вместо этого. –

+0

вы должны использовать только один «набор», например: таблица обновлений col1 = a, col2 = b, col3 = c ... –

+0

Woops. Моя ошибка при создании простого примера. Исправлено: – l46kok

ответ

6

Что-то вроде этого? В принципе, просто присоедините набор из PRICE_TB к условию того, какой столбец вы хотите получить от него.

Но предполагается, что у вас будет только один PRICE_TB.TYPE для обновленного имени столбца PROD_TB и что каждый столбец PROD_TB всегда содержит значение в PRICE_TB, иначе оно будет NULL, и эта строка не будет возвращена. Поэтому убедитесь, что вы знаете варианты данных, которые могут существовать здесь.

UPDATE PROD 
SET Reg_Price = REG.Price, Sale_Price = SALE.Price 
FROM PROD_TB PROD 
JOIN PRICE_TB REG ON REG.Product_Code = PROD.Product_Code AND REG.Type = 'REG' 
JOIN PRICE_TB SALE ON SALE.Product_Code = PROD.Product_Code AND SALE.Type = 'SALE' 
+1

Невероятно глупо от меня .. это как-то сошло с ума. Спасибо, я соглашусь через несколько минут. – l46kok

+0

Бывает среди лучших из нас, не стоит беспокоиться , :) – Kahn

1

Вам нужно получить данные в один ряд первых, вот пример, который выбирает всегда самую большую цену, в случае, если есть более чем один в PRICE_TB, в противном случае он должен работать так же, как @ SQL Кана.

UPDATE 
    PROD 
SET 
    PROD.Reg_Price = PRICE.Reg_Price, 
    PROD.Sales_Price = PRICE.Sales_Price 
FROM PROD_TB PROD, cross apply (
    select 
    max(CASE WHEN Type = 'REG' THEN Price ELSE 0 end) as Reg_Price, 
    max(CASE WHEN Type = 'SALE' THEN Price ELSE 0 end) as Sale_Price 
    from 
    PRICE_TB PRICE 
    where 
    PRICE.Product_Code = PROD.Product_Code 
) PRICE 
+0

, если в таблице PRICE_TB есть третий тип и нет других соответствующих строк, это установит значение цены в 0. Не уверен, что это то, что необходимо. Возможно, скрытая функция. Отрицательные значения также будут установлены на 0. Вряд ли это произойдет, но все же не может ничего исключить, не зная бизнес-логики –

0

Если таблица PRICE_TB не всегда содержат оба значения, вы могли бы использовать это, чтобы убедиться, что таблица обновляется в любом случае:

UPDATE t1 
SET 
    Reg_Price = coalesce(t2.Price, t1.Reg_Price), 
    Sale_Price = coalesce(t3.Price, t1.Sale_Price) 
FROM PROD_TB t1 
LEFT JOIN 
    PRICE_TB t2 
ON 
    t1.ProductCode = t2.ProductCode AND 
    t2.[Type] = 'REG' 
LEFT JOIN 
    PRICE_TB t3 
ON 
    t1.ProductCode = t3.ProductCode AND 
    t3.[Type] = 'SALE' 
WHERE 
    t2.[Type] = 'REG' OR 
    t3.[Type] = 'SALE' 
Смежные вопросы