Используйте подзапрос с оператором обновления - PullRequest
0 голосов
/ 05 ноября 2019

Мне нужно обновить две верхние строки столбца на основе оператора select top 2 с помощью некоторых выражений.

update top(2) [Travel].[dbo].[HOTELS]
set [Travel].[dbo].[HOTELS].NAME = (select top(2) SUBSTRING(Name, 1, 5) + 'xxxxx' + SUBSTRING(Name, LEN(Name) - 2, LEN(Name)) AS column1
                                    from [Travel].[dbo].[HOTELS]                                    
                                   )

При указанном выше запросе я получаю эту ошибку

Подзапрос вернул более 1 значения. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

Я должен использовать это в обоих SQL Serverи в Oracle.

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

В вашем подзапросе у вас есть топ-2, измените лимит на 1

update top 2  [Travel].[dbo].[HOTELS]
   set [Travel].[dbo].[HOTELS].NAME  = (
     select top 1  SUBSTRING(Name, 1, 5) + 'xxxxx' + SUBSTRING(Name, LEN(Name) - 2, LEN(Name)) AS column1
    from [Travel].[dbo].[HOTELS]
    where [Travel].[dbo].[HOTELS].id = 1415
  )

. Если вы не хотите использовать условие where, не используйте его, например:

  update top 2  [Travel].[dbo].[HOTELS]
set [Travel].[dbo].[HOTELS].NAME  = (
    select top 1  SUBSTRING(Name, 1, 5) + 'xxxxx' + SUBSTRING(Name, LEN(Name) - 2, LEN(Name)) AS column1
    from [Travel].[dbo].[HOTELS]

  )
1 голос
/ 05 ноября 2019

в sql-сервере вы можете использовать cte + select data first, затем обновить его.

CREATE TABLE HOTELS
  ([NAME] varchar(14))
;

INSERT INTO HOTELS
  ([NAME])
VALUES
  ('ABCDEFG'),
  ('HIJKLMOP')
;
GO
with cte as (
    select top 2 NAME, SUBSTRING(Name, 1, 5) + 'xxxxx' + SUBSTRING(Name, LEN(Name) - 2, LEN(Name)) AS column1
    from [HOTELS]
)
update cte set NAME = column1;
GO
2 rows affected
select * from HOTELS;
| NAME          |
| :------------ |
| ABCDExxxxxEFG |
| HIJKLxxxxxMOP |

дБ <> скрипка здесь


редактировать для версии оракула

CREATE TABLE Table1
  ("NAME" varchar2(80))
;
INSERT ALL 
  INTO Table1 ("NAME")
       VALUES ('ABCDEFG')
  INTO Table1 ("NAME")
       VALUES ('HIJKLMOP')
SELECT * FROM dual
;
2 rows affected
update Table1
set name = SUBSTR(Name, 1, 5) || 'xxxxx' || SUBSTR(Name, LENGTH(Name) - 2, LENGTH(Name)-1)
where rownum <= 2
2 rows affected
select * from Table1
| NAME          |
| :------------ |
| ABCDExxxxxEFG |
| HIJKLxxxxxMOP |

db <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...