在更改id - SQL时组合表

时间:2014-12-21 14:57:37

标签: mysql sql sqlite

我正在尝试使用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

请帮帮我。感谢。

3 个答案:

答案 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 querySub 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;

SqlFiddle