powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / update top (n) .... ORDER BY ... - хочу кнопку "beautify"
14 сообщений из 14, страница 1 из 1
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
    #39936842
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня!

Конструкция update top (n) .... ORDER BY ... в MS SQL не работает не поддерживается. На MS-сайте написан обходной вариант. Как думаете, когда-нибудь сделают?

Поделитесь, если решали подобное, опытом,- а то может я изобретаю велосипед?

Может можно через MERGE, а я не "чухаю" всей мощи сей чудесной команды?

Правда, у меня есть "засада" - UPDATE с простым WHERE не возможен,- ибо может быть несколько строк (полностью идентичных в КЛЮЧЕВЫХ полях!), которые выбираются по where-предикату.
Что бы изменить только одну из них и сбросить в таблицу по OUTPUT, я и ставлю TOP (1).
А хотелось бы их ещё и сортировать (ну, что бы выбирать по определённому параметру...).

Сейчас приходится выбирать ещё и граничное условие и пихать его во where (скажем, появляется CTE, через которое это условие и формируется).

Вроде всё работает, но нет "стройности и красивости". В общем, хочу кнопку "beautify" ;)

--------------------------
No ROM Basic...

PS Вот понравилась идея воспользоваться update top (1) ... output ... order by ... ,- но не прокатило
...
Рейтинг: 0 / 0
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
    #39936844
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_,

обычно
Код: sql
1.
with cte as (select top ...) update cte set ...
...
Рейтинг: 0 / 0
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
    #39936900
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_,

Ответ прост как 3 копейки. Список Id для обновления во временную таблицу и потом её использовать в merge, чтобы срезать число обновляемых записей (выбрать только первые n во временную таблицу).

Но мне непонятно другое -- а зачем обновлять конкретно первые n записей в порядке сортировки?
...
Рейтинг: 0 / 0
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
    #39936902
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
Но мне непонятно другое -- а зачем обновлять конкретно первые n записей в порядке сортировки?

"взять" в обработку первую запись из очереди.
...
Рейтинг: 0 / 0
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
    #39936904
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_,

Я вот другого не пойму -- у меня update top n работает.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
USE tempdb
GO 

CREATE TABLE X(ID INT NOT NULL IDENTITY(1,1), A UNIQUEIDENTIFIER NOT NULL DEFAULT(NEWID()) )
GO

INSERT INTO X DEFAULT VALUES
GO 100

WITH a AS
(SELECT TOP 10 * FROM X) 
UPDATE a SET A = NEWID()
GO

SELECT @@VERSION 




(10 rows affected)
Microsoft SQL Server 2019 (RTM-GDR) (KB4517790) - 15.0.2070.41 (X64) Oct 28 2019 19:56:59 Copyright (C) 2019 Microsoft Corporation Developer Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: )
...
Рейтинг: 0 / 0
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
    #39936905
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
SIMPLicity_,

Я вот другого не пойму -- у меня update top n работает.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
USE tempdb
GO 

CREATE TABLE X(ID INT NOT NULL IDENTITY(1,1), A UNIQUEIDENTIFIER NOT NULL DEFAULT(NEWID()) )
GO

INSERT INTO X DEFAULT VALUES
GO 100

WITH a AS
(SELECT TOP 10 * FROM X) 
UPDATE a SET A = NEWID()
GO

SELECT @@VERSION 




(10 rows affected)
Microsoft SQL Server 2019 (RTM-GDR) (KB4517790) - 15.0.2070.41 (X64) Oct 28 2019 19:56:59 Copyright (C) 2019 Microsoft Corporation Developer Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: )


Ключевое слово - top (n) ... ORDER BY ...
...
Рейтинг: 0 / 0
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
    #39936906
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakill
SIMPLicity_,

обычно
Код: sql
1.
with cte as (select top ...) update cte set ...



Спасибо! Не въехал как оно работает, но похоже что "это то что надо"...

PS Если подумать, то CTE это всего лишь навсего view , но у меня в башке это не укладывается.

... Ибо до сих пор к CTE я отношусь как к способу получения выборки из адской таблицы (усечение по WHERE-предикату
в описании CTE) ,- что бы потом этот кусок многократно "повертеть на х@ю" и так и сяк в основном запросе )
...
Рейтинг: 0 / 0
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
    #39936907
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_,


так тоже работает

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
USE tempdb
GO 

CREATE TABLE X(ID INT NOT NULL IDENTITY(1,1), A UNIQUEIDENTIFIER NOT NULL DEFAULT(NEWID()) )
GO

INSERT INTO X DEFAULT VALUES
GO 100

WITH a AS
(SELECT TOP 10 * FROM X ORDER BY ID) 
UPDATE a SET A = NEWID()
GO

SELECT @@VERSION 
...
Рейтинг: 0 / 0
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
    #39936908
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_
Ключевое слово - top (n) ... ORDER BY ...
Так и ORDER BY тут будет работать:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
USE tempdb
GO 
CREATE TABLE X(ID INT NOT NULL IDENTITY(1,1), A UNIQUEIDENTIFIER NOT NULL DEFAULT(NEWID()), B varchar(100) DEFAULT(convert(varchar(100), NEWID())))
GO

INSERT INTO X DEFAULT VALUES
GO 20

WITH a AS
(SELECT TOP 10 * FROM X order by B) 
UPDATE a SET A = NEWID()
GO
...
Рейтинг: 0 / 0
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
    #39937058
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_,

TOP не имеет отношения к проблеме, синтаксис UPDATE не предусматривает сортировку.
...
Рейтинг: 0 / 0
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
    #39937069
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_
Shakill
SIMPLicity_,

обычно
Код: sql
1.
with cte as (select top ...) update cte set ...




Спасибо! Не въехал как оно работает, но похоже что "это то что надо"...

PS Если подумать, то CTE это всего лишь навсего view , но у меня в башке это не укладывается.

... Ибо до сих пор к CTE я отношусь как к способу получения выборки из адской таблицы (усечение по WHERE-предикату
в описании CTE) ,- что бы потом этот кусок многократно "повертеть на х@ю" и так и сяк в основном запросе )


Это ничем не отличатся от обычного подзапроса

Код: sql
1.
2.
update a set b = 3 
from (select top 10 * from table order by id desc) a
...
Рейтинг: 0 / 0
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
    #39937091
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SIMPLicity_

... Ибо до сих пор к CTE я отношусь как к способу получения выборки из адской таблицы
Рекурсия ещё, однако. Есть класс задач, где без неё не обойтись.
...
Рейтинг: 0 / 0
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
    #39937186
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_
PS Если подумать, то CTE это всего лишь навсего view , но у меня в башке это не укладывается.

наоборот, вью и cte это всего лишь навсего подзапросы :)

а если продолжать аналогию, то вьюхи же можно апдейтить при определенных условиях , почему cte нельзя
...
Рейтинг: 0 / 0
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
    #39939791
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakill
SIMPLicity_,

обычно
Код: sql
1.
with cte as (select top ...) update cte set ...



Спасибо ещё раз!

with cte as (select top ... ) update cte set .... output ...

Попробовал,- восхитительно!
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / update top (n) .... ORDER BY ... - хочу кнопку "beautify"
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]