mysql - 如何在mysql中在union之前插入一行?

标签 mysql sql

假设我有以下内容:

CREATE TABLE newtable AS (
SELECT @rownum:=@rownum+1 as rownum, name, age FROM (
    SELECT name, age FROM clubAmembers
    UNION
    SELECT name, age FROM clubBmembers
)
) AS atable

如何才能使我可以在 SELECT 联合之前“在表的开头插入一个新行”,以便它以以下方式开头:

rownum | name| age
1 | "Jordan" | 6  <-- This is an arbitrarily inserted record with name="Jordan" age="6" that is not a part of any of the clubAmembers or clubBmembers table.

表的其余部分(rownum 2 及以后)将包含与clubAmembers 和clubBmembers 联合的实际结果。

基本上我正在寻找: 创建表 插入一行“乔丹” | 6 使用 union 执行选择,使得第一行之后的行以“rownum=2”开头,来自clubAmembers 的所有数据等。

如何最好地做到这一点?

最佳答案

“在表的开头”对于关系数据库来说并没有真正的意义,因为只有在使用 ORDER BY 子句之前才能保证返回的顺序结果,此时磁盘上的顺序变为无论如何,这是一个有争议的问题。

就您而言,由于您想保证结果子句中的顺序(因此排序@rownum,因此您必须使用ORDER BY。例如:

CREATE TABLE newtable AS (
    SELECT @rownum:=@rownum+1 as rownum, name, age 
    FROM (
        SELECT 'Jordan' AS name, 6 AS age, 0 AS ord
        UNION
        SELECT name, age, 1 AS ord FROM clubAmembers
        UNION
        SELECT name, age, 1 AS ord FROM clubBmembers
        ORDER BY ord
    )
) AS atable

请注意,这并不能保证 clubAmembers 中的行的 rownum 低于 clubBmembers 中的行。如果您想保证 clubAmembers 具有较低的 rownum,同时保留 UNION 的语义(相对于 UNION ALL ),您可以使用以下内容:

CREATE TABLE newtable AS (
    SELECT @rownum:=@rownum+1 as rownum, name, age 
    FROM (
        SELECT 'Jordan' AS name, 6 AS age, 0 AS ord
        UNION ALL
        SELECT name, age, 1 AS ord FROM clubAmembers
        UNION ALL
        SELECT name, age, 2 AS ord FROM clubBmembers AS b
        WHERE NOT EXISTS(SELECT 1 FROM clubAmembers AS a 
                         WHERE a.name = b.name AND a.age = b.age)
        ORDER BY ord
    )
) AS atable

请注意,如果 {name, age} 在 clubXmembers 表中可能重复,您将需要添加 DISTINCT:

...
SELECT DISTINCT name, age, 1 AS ord FROM clubAmembers
UNION ALL
...

根据评论中的要求,如果您有一个 clubCmembers 表,您将执行以下操作:

CREATE TABLE newtable AS (
    SELECT @rownum:=@rownum+1 as rownum, name, age 
    FROM (
        SELECT 'Jordan' AS name, 6 AS age, 0 AS ord
        UNION ALL
        SELECT name, age, 1 AS ord FROM clubAmembers
        UNION ALL
        SELECT name, age, 2 AS ord FROM clubBmembers AS b
        WHERE NOT EXISTS(SELECT 1 FROM clubAmembers AS a 
                         WHERE a.name = b.name AND a.age = b.age)
        SELECT name, age, 3 AS ord FROM clubCmembers AS c
        WHERE NOT EXISTS(SELECT 1 FROM clubAmembers AS a 
                         WHERE a.name = c.name AND a.age = c.age)
        AND NOT EXISTS(SELECT 1 FROM clubBmembers AS b
                       WHERE b.name = c.name AND b.age = c.age)
        ORDER BY ord
    )
) AS atable

关于mysql - 如何在mysql中在union之前插入一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14722270/

相关文章:

mysql - 当我使用 WHERE IN 条件时,SQL 查询用户名不出现

sql - 计算分层 SQL 数据中的子级数量

sql - 我们可以在 SQL 语句中一起使用 SUM 和 Max Function 吗?

mysql - 浮点字段的 SQL 更新不起作用 mysql

Mysql,如何合并连接查询的结果?

mysql - 数据库建模 : Facebook like messages

php - 加载文件中的数据给我一个访问被拒绝的权限错误。我还能如何将文本文件导入数据库中的表中?

sql - 这个查询如何停止?

php - 将 MySQL 结果保存在二维数组中 - php

sql - 分、秒、毫秒的 varchar 或 decimal 数据类型