我有两个表(列名在括号中): 汽车(CarColorId,CarName),CarColor(CarColorId,CarColorName);
任务是使用字符串“_updated”更新Cars.CarName,但仅限于CarColor.CarColorName ='red'。我知道如何在没有连接的情况下执行此操作
我试过这种方式:
UPDATE Cars set CarName = concat (CarName, '_updated') WHERE CarColorId = 1;
CarColorId = 1 =红色; 此请求有效,但任务是使用两个表
答案 0 :(得分:2)
您可以在Oracle中尝试其中任何一项
正常更新
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');
使用内嵌视图(如果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' );
答案 1 :(得分:1)
您可以像这样修改您的查询:
UPDATE
Cars
set
CarName = concat (CarName, '_updated')
WHERE
CarColorId in (
select
CarColorId
from
CarColor
where
CarColorName='red'
)
;
答案 2 :(得分:0)
我知道你说你不知道如何在没有任何联接的情况下这样做。我不知道这是否意味着您更愿意避免加入,或者如果可以的话,您是否愿意使用它们。如果是后者,那么请查看这段代码:
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';
希望这也有帮助。
Ť