Mysql:在select语句中创建内联表?

时间:2012-03-01 16:51:02

标签: mysql sql

在MySql中是否有办法创建一个用于连接的内联表?

类似的东西:

SELECT LONG [1,2,3] as ID, VARCHAR(1) ['a','b','c'] as CONTENT

将输出

|  ID  |  CONTENT  |
| LONG | VARCHAR(1)|
+------+-----------+
|   1  |    'a'    |
|   2  |    'b'    |
|   3  |    'c'    |

我可以在这样的连接中使用:

SELECT 
  MyTable.*,
  MyInlineTable.CONTENT
FROM
  MyTable
  JOIN 
    (SELECT LONG [1,2,3] as ID, VARCHAR(1) ['a','b','c'] as CONTENT MyInlineTable)
  ON MyTable.ID = MyInlineTable.ID

我意识到我可以做到

SELECT 1,'a' UNION SELECT 2,'b' UNION SELECT 3,'c'

但这似乎很邪恶

我不想做存储过程,因为潜在的a,b,c也可以在每次查询和数据大小时发生变化。还需要将存储过程保存在数据库中,我不想仅为此修改数据库。 观点是一回事。

我真正想要的是SELECT 1,'a' UNION SELECT 2,'b' UNION SELECT 3,'c'具有更好的语法。

3 个答案:

答案 0 :(得分:6)

我现在唯一能记住的方法是使用UNION或创建TEMPORARY TABLE并将这些值插入其中。它适合你吗?


TEMPORARY_TABLE(已测试且有效):

<强>创作:

CREATE TEMPORARY TABLE MyInlineTable (id LONG, content VARCHAR(1) );

INSERT INTO MyInlineTable VALUES
(1, 'a'),
(2, 'b'),
(3, 'c');

<强>用法:

SELECT 
  MyTable.*,
  MyInlineTable.CONTENT
FROM
  MyTable
  JOIN 
    SELECT * FROM MyInlineTable;
  ON MyTable.ID = MyInlineTable.ID

TEMPORARY_TABLES 有生之年 (reference)

  

临时表在超出范围时会自动删除,除非它们已使用DROP TABLE显式删除:

  

所有其他本地临时表在当前会话结束时自动删除。

  

当创建表的会话结束且所有其他任务已停止引用它们时,将自动删除全局临时表。任务和表之间的关联仅在单个Transact-SQL语句的生命周期内维护。这意味着在创建会话结束时,在最后一个主动引用表的Transact-SQL语句完成时,将删除全局临时表。

答案 1 :(得分:3)

我真正要寻找的是具有更好的语法的SELECT 1,'a'UNION SELECT 2,'b'UNION SELECT 3,'c'。

是的,可以使用MySQL 8.0.19中引入的 ROW CONSTRUCTOR

VALUES ROW (1,'a'), ROW(2,'b'), ROW(3,'c') 

并带有JOIN:

SELECT *
FROM tab 
JOIN (VALUES ROW (1,'a'), ROW(2,'b'), ROW(3,'c') ) sub(id, content)
  ON tab.id = sub.id;

db<>fiddle demo

答案 2 :(得分:-1)

是。使用stored proceduresviews

相关问题