混合变量分配和数据检索-MySQL与MS SQL Server

时间:2019-11-01 19:10:14

标签: mysql sql sql-server

我正在尝试使用sql查询来刷新我的技能,这是我很多年没有使用过了。

在做一些练习的同时,我遇到了一个问题,该问题在MySql中很容易解决,而在sql server中更复杂。我想知道是否有更简单的方法。

为了这个问题,我会简化问题(以避免复杂的代码)

所以,我有一个数字序列。在此序列中,我要标识编号为<10的子序列并对其编号。当满足数字> = 10时,将由seqno计数器开始标识一个新的子序列。下面的mysql查询+结果?

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 Server,事情变得更加复杂,因为在同一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 个答案:

答案 0 :(得分:2)

您似乎希望对10个以上的值进行累计计数:

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

Here是db <>小提琴。

请注意,SQL表表示无序集。您的查询假设该表的顺序-在一般SQL或任一数据库中均无效。您的查询确实似乎可以在MySQL中工作,但不能保证。

我添加了一个id列以捕获顺序,因此该查询将起作用。

顺便说一句,这也是MySQL 8+中的首选方法。不建议使用变量。