VALUES構築子はINSERT文以外でも使えます(SQL-99から)。
SELECT
*
FROM
(VALUES
(1, 'Alice')
, (2, 'Bob')
, (3, 'Carol')
) AS users
(id, name)
| id | name |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Carol |
もちろん、JOINすることもできます。
SELECT
users.id
, users.name
, comments.comment
FROM
(VALUES
(1, 'Alice')
, (2, 'Bob')
, (3, 'Carol')
) AS users
(id, name)
LEFT OUTER JOIN
(VALUES
(1, 'Hello')
, (3, 'World')
) AS comments
(user_id, comment)
ON users.id = comments.user_id
| id | name | comment |
|---|---|---|
| 1 | Alice | Hello |
| 2 | Bob | NULL |
| 3 | Carol | World |
UPDATEやDELETEはできないものの、一時テーブルを作らずに済むので楽です。
データ型はどうなるの?
SQL Serverで値の情報を調べるには、SQL_VARIANT_PROPERTY関数を使います。
SELECT
*
, SQL_VARIANT_PROPERTY(id, 'BaseType') id_type
, SQL_VARIANT_PROPERTY(name, 'BaseType') name_type
FROM
(VALUES
(1, 'Alice')
, (2, 'Bob')
, (3, 'Carol')
) AS users
(id, name)
| id | name | id_type | name_type |
|---|---|---|---|
| 1 | Alice | int | varchar |
| 2 | Bob | int | varchar |
| 3 | Carol | int | varchar |
値に応じて、適当なデータ型が与えられるようです。