我正在尝试将MySQL查询转换为SQL Server。
SELECT
@a:= @a + 1 serial_number,
a.id,
a.file_assign_count
FROM usermaster a,
workgroup_master b,
(
SELECT @a: = 0
) AS c
WHERE a.wgroup = b.id
AND file_assign_count > 0
我理解:= MySQL中的运算符将值赋给变量&立即返回值。但是如何在SQL Server中模拟这种行为?
答案 0 :(得分:3)
SQL Server 2005及更高版本支持标准ROW_NUMBER()功能,因此您可以这样做:
SELECT ROW_NUMBER() OVER (ORDER BY xxxxx) AS serial_number,
a.id,
a.file_assign_count
FROM usermaster a
JOIN workgroup_master b ON a.wgroup = b.id
WHERE file_assign_count > 0
重新评论:我编辑了以上内容以显示OVER
子句。如果您定义排序顺序,则行编号仅具有任何含义。您的原始查询没有这样做,这意味着它由RDBMS决定返回行的顺序。
但是当使用ROW_NUMBER()时,你必须具体。在我放置xxxxx
的位置,您可以放置一个列或表达式来定义排序顺序。请参阅the documentation中的说明和示例。
子查询设置@a:=0
仅用于初始化该变量,并且无论如何都不需要将其加入查询中。它只是一些开发人员使用的风格。在SQL Server中不需要这样做,因为当您可以使用ROW_NUMBER()时,根本不需要用户变量。
如果SQL Server数据库返回MySQL数据库返回一行的两行,则数据必须不同。因为ROW_NUMBER()或MySQL用户变量都不会限制返回的行数。
P.S。:请使用JOIN
语法。它自1992年以来一直是标准的。