2014-01-03 3 views
0

проблема:База данных Oracle. Как обновить выбранные столбцы.

У меня есть две таблицы (имена столбцов в скобках): Автомобили (CarColorId, CarName), CarColor (CarColorId, CarColorName);

Задача состоит в том, чтобы ОБНОВИТЬ Cars.CarName со строкой «_updated», но только если CarColor.CarColorName = «red». Я знаю, знаю, как сделать это, не присоединяется

Я попробовал этот путь:

UPDATE Cars set CarName = concat (CarName, '_updated') WHERE CarColorId = 1; 

CarColorId = 1 = красный; Этот запрос работает, но задача состоит в том, чтобы использовать обе таблицы

ответ

2

Вы можете попробовать любой из этого в Oracle

Normal Update

UPDATE 
     CARS 
SET 
     CARS.CARNAME = 
      CONCAT (CARS.CARNAME, 
       '_updated') 
WHERE 
     EXISTS 
      (SELECT 
       CARCOLOR.CARCOLORID 
      FROM 
       CARCOLOR 
      WHERE 
       CARS.CARCOLORID = CARCOLOR.CARCOLORID 
       AND CARCOLOR.CARCOLORNAME = 'RED'); 

Использование Inline View (если он считается обновляемым Oracle)

Примечание: Если вы сталкиваетесь с нон ключ сохраняется ошибка строки добавить индекса для того же, чтобы сделать его обновить, в состоянии

UPDATE 
     (SELECT 
      CARS.CARNAME AS OLD, 
      CONCAT (CARS.CARNAME, 
        '_updated') 
       AS NEW 
     FROM 
       CARS 
      INNER JOIN 
       CARCOLOR 
      ON CARS.CARCOLORID = CARCOLOR.CARCOLORID 
     WHERE 
      CARCOLOR.CARCOLORNAME = 'RED') T 
SET 
     T.OLD  = T.NEW; 

Использование слияния

MERGE INTO 
     CARS 
USING 
     (SELECT 
      CARS.ROWID AS RID 
     FROM 
       CARS 
      INNER JOIN 
       CARCOLOR 
      ON CARS.CARCOLORID = CARCOLOR.CARCOLORID 
     WHERE 
      CARCOLOR.CARCOLORNAME = 'RED') 
ON 
     (ROWID = RID) 
WHEN MATCHED 
THEN 
    UPDATE SET CARS.CARNAME = 
       CONCAT (CARS.CARNAME, 
         '_updated'); 
+0

спасибо, это работает отлично – Mark2

1

Вы можете изменить свой запрос, как это:

UPDATE 
    Cars 
set 
    CarName = concat (CarName, '_updated') 
WHERE 
    CarColorId in (
    select 
     CarColorId 
    from 
     CarColor 
    where 
     CarColorName='red' 
) 
; 
+0

спасибо, это один работает – Mark2

0

I знаете, что вы сказали, что не знаете, как это сделать без каких-либо объединений. Я не знаю, означает ли это, что вы предпочтете избегать объединений или будете ли вы открыты для возможности использовать их, если сможете. Если это так, то проверьте этот код:

UPDATE 
    (
      SELECT c.CarName, cc.CarColorName 
      FROM Cars c 
     INNER JOIN CarColors cc 
       ON c.CarColorId = cc.CarColorId 
    ) CarsWithColor 
    SET CarsWithColor.CarName = CarsWithColor.CarName || '_Updated' 
    WHERE CarsWithColor.CarColorName = 'red'; 

Надеюсь, это поможет.

T

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