在MySql中有没有办法创建一个用于连接的内联表?
就像是:
SELECT LONG [1,2,3] as ID, VARCHAR(1) ['a','b','c'] as CONTENT
Run Code Online (Sandbox Code Playgroud)
那将输出
| ID | CONTENT |
| LONG | VARCHAR(1)|
+------+-----------+
| 1 | 'a' |
| 2 | 'b' |
| 3 | 'c' |
Run Code Online (Sandbox Code Playgroud)
并且我可以在这样的连接中使用:
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
Run Code Online (Sandbox Code Playgroud)
我意识到我能做到
SELECT 1,'a' UNION SELECT 2,'b' UNION SELECT 3,'c'
Run Code Online (Sandbox Code Playgroud)
但这似乎很邪恶
我不想做存储过程,因为潜在的a,b,c也可以在每次查询时改变数据的大小.还需要将存储过程保存在数据库中,我不想仅为此修改数据库.观点是一回事.
我真正想要的是SELECT 1,'a' UNION SELECT 2,'b' UNION SELECT 3,'c'使用更好的语法.
我真正想要的是用更好的语法执行 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')
Run Code Online (Sandbox Code Playgroud)
并加入:
SELECT *
FROM tab
JOIN (VALUES ROW (1,'a'), ROW(2,'b'), ROW(3,'c') ) sub(id, content)
ON tab.id = sub.id;
Run Code Online (Sandbox Code Playgroud)
我现在记住的唯一方法是使用UNION或创建一个TEMPORARY TABLE并将这些值插入其中.它适合你吗?
TEMPORARY_TABLE (测试并且有效):
创建:
CREATE TEMPORARY TABLE MyInlineTable (id LONG, content VARCHAR(1) );
INSERT INTO MyInlineTable VALUES
(1, 'a'),
(2, 'b'),
(3, 'c');
Run Code Online (Sandbox Code Playgroud)
用法:
SELECT
MyTable.*,
MyInlineTable.CONTENT
FROM
MyTable
JOIN
SELECT * FROM MyInlineTable;
ON MyTable.ID = MyInlineTable.ID
Run Code Online (Sandbox Code Playgroud)
TEMPORARY_TABLES 一生 (参考):
临时表在超出范围时会自动删除,除非已使用DROP TABLE显式删除它们:
.
所有其他本地临时表在当前会话结束时自动删除.
.
当创建表的会话结束并且所有其他任务已停止引用它们时,将自动删除全局临时表.任务和表之间的关联仅在单个Transact-SQL语句的生命周期内维护.这意味着在创建会话结束时主动引用表的最后一个Transact-SQL语句完成时,将删除全局临时表.
| 归档时间: |
|
| 查看次数: |
6302 次 |
| 最近记录: |