MariaDBまたはMySQLがSQL仕様に_<table value constructor>
_を実装しているかどうか疑問に思っています。 SQL Server および PostgreSQLでは、これは標準化されたVALUES (expression)
?
_SELECT *
FROM ( VALUES (1) ) AS t(x);
x
---
1
(1 row)
_
(構文は postgresql から)。
はい、そうです MariaDB 10.3.3以降では、テーブル値コンストラクタをサポートしているようです。
SELECT 1、t.7 FROM(VALUES(7)、(42))AS t; 1 | 7 -------- 1 | 7 1 | 42
FROM
句では column_alias がサポートされておらず、代わりに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
_
さらに、最初の行に明確なエイリアスを与えることで、これを回避できる場合があります。
_SELECT 1 AS x ,2 AS y
UNION VALUES (3,4),(5,6);
x | y
-------
1 | 2
3 | 4
5 | 6
_
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
_
ただし、リテラルを使用した副選択はサポートされています。
_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)
_
PostgreSQLもこの構文をサポートしています。
_SELECT * FROM ( SELECT 1 AS x ) AS t;
x
---
1
(1 row)
_
ただし、複数の行を実行している場合、この構文を使用すると物事がより冗長になります。 MariaDBの下で、PostgreSQLでも動作します
_SELECT * FROM ( SELECT 1 AS x UNION ALL SELECT 2 ) AS t;
+---+
| x |
+---+
| 1 |
| 2 |
+---+
_
VALUES
の場合は、単にVALUES (1),(2)
です。