我有两张桌子。一个是本地的,另一个是外国的。所以我想要做的是在使用存储过程连接两个表后给出行号。 首先,我想从两个表中获取相同数量的列,之后我想组合成一个表并给出行号。 以下是我的询问。
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 ) ;
有人可以告诉我它有什么问题吗?
答案 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
,您只需避免在单独的语句中创建变量。