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

Конструкция 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
12.03.2020, 21:11
    #39936844
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
SIMPLicity_,

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

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

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

"взять" в обработку первую запись из очереди.
...
Рейтинг: 0 / 0
13.03.2020, 08:23
    #39936904
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
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
13.03.2020, 08:26
    #39936905
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
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
13.03.2020, 08:35
    #39936906
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
Shakill
SIMPLicity_,

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



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

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

... Ибо до сих пор к CTE я отношусь как к способу получения выборки из адской таблицы (усечение по WHERE-предикату
в описании CTE) ,- что бы потом этот кусок многократно "повертеть на х@ю" и так и сяк в основном запросе )
...
Рейтинг: 0 / 0
13.03.2020, 08:43
    #39936907
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
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
13.03.2020, 08:44
    #39936908
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
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
13.03.2020, 13:21
    #39937058
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
SIMPLicity_,

TOP не имеет отношения к проблеме, синтаксис UPDATE не предусматривает сортировку.
...
Рейтинг: 0 / 0
13.03.2020, 13:37
    #39937069
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
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
13.03.2020, 14:01
    #39937091
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update top (n) .... ORDER BY ... - хочу кнопку "beautify"
SIMPLicity_

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

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

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

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



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

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

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


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