Eva*_*oll 5 mysql mariadb sql-standard mariadb-10.3
我只是想知道 MariaDB 或 MySQL 是否<table value constructor>在 SQL 规范中实现了。在SQL Server和PostgreSQL 中,这是通过标准化的VALUES (expression)?
SELECT *
FROM ( VALUES (1) ) AS t(x);
x
---
1
(1 row)
Run Code Online (Sandbox Code Playgroud)
(来自postgresql 的语法)。
小智 8
是的,谈到MariaDB 10.3.3 和更高版本,它似乎支持表值构造函数。
选择 1,t.7 FROM (VALUES (7),(42)) AS t; 1 | 7 -------- 1 | 7 1 | 42
你会发现,不存在用于支持column_alias中FROM条款,而不是要求你使用table_alias和名称第一行的该列的值。但是在 CTE 的WITH子句中允许 column_alias ,
WITH t(a) AS ( VALUES (1),(2) )
SELECT t.a, t.a AS b
FROM t;
a | b
--------
1 | 1
2 | 2
Run Code Online (Sandbox Code Playgroud)
此外,您可以通过为第一行指定一个明确的别名来绕过这一点。
SELECT 1 AS x ,2 AS y
UNION VALUES (3,4),(5,6);
x | y
-------
1 | 2
3 | 4
5 | 6
Run Code Online (Sandbox Code Playgroud)
另请参阅https://jira.mariadb.org/browse/MDEV-12172 中的示例
PostgreSQL 允许在 FROM 子句中使用列别名,如上所示t(x),MariaDB 也不支持此语法
在 MariaDB 10.3 之前,所有版本的 MySQL 都不支持该VALUES表达式。
SELECT * FROM ( VALUES (1) ) AS t(x);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'VALUES (1) ) AS t(x)' at line 1
Run Code Online (Sandbox Code Playgroud)
但是,它确实支持带有文字的子选择。
SELECT * FROM (SELECT (1) AS x) AS t;
-- more simply
-- SELECT * FROM (SELECT 1 AS x) AS t;
+---+
| x |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
PostgreSQL 也支持这种语法。
SELECT * FROM ( SELECT 1 AS x ) AS t;
x
---
1
(1 row)
Run Code Online (Sandbox Code Playgroud)
但是,如果您执行多行,则使用此语法会变得更加冗长。下面来自 MariaDB,也适用于 PostgreSQL
SELECT * FROM ( SELECT 1 AS x UNION ALL SELECT 2 ) AS t;
+---+
| x |
+---+
| 1 |
| 2 |
+---+
Run Code Online (Sandbox Code Playgroud)
而 with VALUES,它只是VALUES (1),(2)
| 归档时间: |
|
| 查看次数: |
3315 次 |
| 最近记录: |