如何使用sql存储过程获取行号

时间:2016-09-30 06:46:41

标签: mysql stored-procedures

我有两张桌子。一个是本地的,另一个是外国的。所以我想要做的是在使用存储过程连接两个表后给出行号。 首先,我想从两个表中获取相同数量的列,之后我想组合成一个表并给出行号。 以下是我的询问。


set @row_number=0;

select (@row_number:=@row_number + 1) as number, 
(
select a.*
from 
(select ID,title,last_name,first_name
from local
)
a
union all
select b.*
from
(select ID,title ,last_name,first_name
from foreign
)
b
)
;

有人可以告诉我它有什么问题吗?

2 个答案:

答案 0 :(得分:2)

ROW_NUMBER

中使用SQL SERVER窗口功能
SELECT Row_number()
         OVER(
           ORDER BY (SELECT NULL))AS number,a.*
FROM   (SELECT ID,
               title,
               last_name,
               first_name
        FROM   local
        UNION ALL
        SELECT ID,
               title,
               last_name,
               first_name
        FROM   FOREIGN) a

注意:(SELECT NULL)替换为您希望按行号生成顺序排列的列。现在行号生成是任意的

答案 1 :(得分:1)

您似乎正在使用MySQL,而不是SQL Server,并尝试模拟行号,如in this duplicate question所示。使用ROW_NUMBER函数在SQL Server中执行此操作非常简单,如@ Prdp的答案所示。

MySQL虽然没有其他数据库中的排名,分析或窗口功能。通过使用非标准SQL技巧,可以以非常有限的方式模拟这些函数,如链接问题中所示。

但这些技巧非常有限。 ROW_NUMBER的典型用法是对组内的记录进行排名,例如按地区排名前十名的销售人员。使用@curRow := @curRow + 1技巧无法做到这一点。还有性能影响。如果按顺序处理行,此技巧将工作。

在问题的情况下,MySQL查询可能如下所示:

SELECT  l.ID,
        l.title,
        l.last_name,
        l.first_name,
        @curRow := @curRow + 1 AS row_number
FROM    (   select ID,title,last_name,first_name
            from local
            UNION ALL
            select ID,title ,last_name,first_name
            from foreign
         ) l
JOIN    (SELECT @curRow := 0) r

这里的技巧是JOIN (SELECT @curRow := 0)创建变量@curRow,初始值为0并返回其值。数据库将获取查询结果,对于每一行,它将增加变量并返回增加的值。这只能在最后完成并强制顺序处理结果。

使用JOIN (SELECT @curRow :=0) r,您只需避免在单独的语句中创建变量。