【问题标题】:Inline queries in MySQL 5.6MySQL 5.6 中的内联查询
【发布时间】:2021-02-10 07:42:55
【问题描述】:

谁能告诉我如何在 MySQL 5.6 中使用内联查询 我正在尝试做一件简单的事情!我正在尝试编写一个查询,在该查询中我从数据库中的一个表中选择并加入一个我试图动态创建的内联表。 这是一个 1 列的表,我无法用多行创建它。

内联查询示例

select * from (
      (select 'filename1' as file_name) as t1
      union
      (select 'filename2' as file_name) as t2
);

如果我在没有第二个 select 语句的情况下运行此查询,那么它可以工作。 但是,如果我使用两个 select 语句运行它并尝试将它们联合起来,它就会崩溃并抱怨我在“as t2”附近的 SQL 语法有错误。

非常感谢任何帮助。

【问题讨论】:

    标签: mysql sql select subquery union


    【解决方案1】:

    显然是一个非常简单的示例,但是... union 查询的成员不使用别名。不过,您使用union 创建的派生表确实需要一张。所以:

    select * from (
          select 'filename1' as file_name
          union all
          select 'filename2'
    ) t;
    

    注意:

    • 没有必要用括号括住union 成员(除非您想要单独的order by 子句)

    • 第二个成员中的列不需要别名:无论如何,第一个查询中定义的别名优先

    • 除非您确实想要删除重复项,否则请使用union all 而不是union:它更有效,并且意图明确

    最后:就您的查询而言,不需要外部查询。这是等价的:

    select 'filename1' as file_name
    union all 
    select 'filename2'
    

    奖励:在最新版本的 MySQL 中,您可以使用 values row() 构造函数:

    select *
    from (values row('filename1'), row('filename2')) t(filename)
    

    【讨论】:

    • 天啊。非常感谢你。有用!我在内部选择语句中尝试不使用别名,但将语句保留在括号中,并且不断收到错误消息,说每个子查询都必须有自己的别名。
    • 我不认为 mariadb 与 row() 构造和使用表别名命名列具有相同性,但您至少可以使用第二行的值,例如 dbfiddle.uk/…
    猜你喜欢
    • 2021-11-13
    • 2023-03-19
    • 1970-01-01
    • 2014-02-01
    • 2015-10-19
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多