Смешивание присвоения переменных и извлечения данных - MySQL против MS SQL Server - PullRequest
1 голос
/ 01 ноября 2019

Я пытаюсь обновить свои навыки с помощью SQL-запросов, которые я не использовал много лет.

При выполнении некоторых упражнений я столкнулся с проблемой, которую довольно просто решить в MySql, но сложнее вSQL Server. Я хотел бы знать, если есть более простой способ сделать это.

Я упрощу проблему ради вопроса (чтобы избежать сложного кода)

Итак, у меня естьпоследовательность чисел. В этой последовательности я хочу идентифицировать и нумеровать подпоследовательности чисел <10. Когда встречается число> = 10, начинается новая подпоследовательность, идентифицируемая счетчиком seqno. Ниже запрос mysql + результат 100

create table myt1(mynum int);
insert into myt1 values (13), (5), (8), (15), (2), (5), (18), (3), (6), (9), (8), (12);
set @seqno = 0;
select mynum, @seqno := case when mynum < 10 then @seqno else @seqno+1 end as seqno
from myt1  

Here is the result

Теперь с SQL-сервером все усложняется, поскольку его нельзя выполнять в одном и том же операторе SELECTкак поиск данных, так и присвоение переменных. Мой обходной путь для получения того же результата состоял в том, чтобы скопировать таблицу во временную таблицу с дополнительным столбцом, а затем обновить таблицу / столбец с помощью следующего кода:

create table myt1(mynum int);
insert into myt1 values (13), (5), (8), (15), (2), (5), (18), (3), (6), (9), (8), (12);
select *, 1 as seqno
into #tempt1
from myt1 

declare @seqno int;
set @seqno = 0;
update #tempt1
set 
    seqno = @seqno, 
    @seqno = case when mynum < 10 then @seqno else @seqno+1 end

select * from #tempt1

Может кто-нибудь сказать мне, если есть более простойспособ написать этот запрос в MSSQL и почему есть ограничение, которое не найдено в MySQL?

Спасибо!

1 Ответ

2 голосов
/ 01 ноября 2019

Похоже, вам нужен совокупный подсчет значений более 10:

select mynum,
       sum(case when mynum >= 10 then 1 else 0 end) over (order by id) as seqno
from myt1;  

Здесь - это скрипта db <>.

Обратите внимание, что таблицы SQL представляют неупорядоченных комплектов. Ваш запрос предполагает упорядочение таблицы - что недопустимо в SQL вообще или в любой базе данных. Ваш запрос кажется работает в MySQL, но нет никаких гарантий.

Я добавил столбец id, чтобы зафиксировать порядок, поэтому запрос будет работать.

Кстати, это также предпочтительный метод в MySQL 8+;использование переменных не рекомендуется.

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