我正在尝试使用UNION在不同的表中创建搜索功能,发生的事情是id的重复使搜索出错。如何将不同的表合并为一个而没有id是共同的?
以下是示例
表1
id name desc
1 henry post
2 albert doth
3 jun cloth
表2
id name desc
1 kin revenge
2 pot eve
结果应该是这样的
id name desc
1 henry post
2 albert doth
3 jun cloth
4 kin revenge
5 pot eve
请帮帮我。感谢。
答案 0 :(得分:1)
在大多数数据库中,您将使用ANSI标准row_number()
函数添加新ID:
select row_number() over (order by which, id) as newid, name, description
from (select 1 as which, t1.* from table1 t1 union all
select 2 as which, t2.* from table2 t2
) t;
请注意desc
是一个非常糟糕的列名,因为它是一个SQL关键字,通常是一个保留字。
编辑:
MySQL不支持此ANSI标准功能。相反,使用变量:
select (@rn := @rn + 1) as newid, name, description
from (select 1 as which, t1.* from table1 t1 union all
select 2 as which, t2.* from table2 t2
) t cross join
(select @rn := 0) vars
order by which, id;
我已经包含了order by
所以行保持的顺序与您希望它们相同的顺序 - 第一个表中的行后跟第二个表中的行。如果您不关心订单,只需删除order by
。
对于SQLite,计算更加痛苦:
with cte as (
select 1 as which, t1.* from table1 t1 union all
select 2 as which, t2.* from table2 t2
)
select (select count(*)
from cte cte2
where cte2.which < cte.which or (ct2.which = cte.which and cte2.id <= cte.id
) as id,
name, description
from cte;
答案 1 :(得分:0)
看起来您必须生成Id's
,这样您就可以Union query
为Sub select
并在Id's
中生成Outer Query
MySQL
没有像SQL Server’s row_number ()
这样的系统函数来生成每行的行号。但是,可以使用variable
SELECT statement
生成它
SET @row_number:=0;
SELECT @row_number:=@row_number+1 As Id,
NAME,
desc
FROM (SELECT NAME,desc
FROM table1
UNION ALL
SELECT NAME,desc
FROM table2
UNION ALL
........
........) A
Order by NAME -- Change the column in Order by in which order you want to create New ID's
答案 2 :(得分:0)
在MySql中,您可以使用变异变量hack来模拟Sql Server和Oracle的row_number()
函数:
set @rownum := 0;
SELECT @rownum:=@rownum+1 AS` row_number`, `name`, `desc`
FROM
(
SELECT `name`, `desc` FROM table1
UNION
SELECT `name`, `desc` FROM table2
) AS x;