SQL
クエリを記述できないようです。このクエリは、テーブルの列と指定された入力値のセットの間のクロス積を計算します。
以下に沿ったもの:
WITH {1,2} as Input
Select *
From mTable.column, Input
mTable.column
値を含む3
および4
、それは返すべきです:
1,3
1,4
2,3
2,4
これを達成する方法はありますか?
他のRDBMS(2008年より前のSQL Serverのような-Paulのコメントによる)では、サブクエリに_UNION ALL SELECT
_でクロス結合することができますが、Postgresにはより便利で効率的なオプションがあります。
そして、あなたはこれのためにCTEを必要としません。使用できますが、パフォーマンス上の利点はありません。
setに VALUES
を指定します:
VALUES
は、値式で指定された行値または行値のセットを計算します。より大きなコマンド内で「定数テーブル」を生成するために最も一般的に使用されますが、それ自体で使用することもできます。
_SELECT t.i, m.col1
FROM mTable m
CROSS JOIN (VALUES (1), (2)) t(i);
_
arrayおよび unnest()
を指定します
2a。 配列コンストラクタ :
_SELECT i, m.col1
FROM mTable m
CROSS JOIN unnest (ARRAY[1,2]) i;
_
2b。配列リテラル:
_SELECT i, m.col1
FROM mTable m
CROSS JOIN unnest ('{1,2}'::int[]) i;
_
結果に並べ替え順序が必要な場合は、_ORDER BY i, m.col1
_を追加します。
行と配列の構文について:
あなたが説明しているのはCROSS JOIN
です。
SELECT input.n, mTable.column
FROM mTable, (
SELECT 1 AS n
UNION ALL
SELECT 2 AS n) AS input;
..または、より最近のSQL表記では、
SELECT input.n, mTable.column
FROM mTable
CROSS JOIN (
SELECT 1 AS n
UNION ALL
SELECT 2 AS n) AS input;
これは基本的に、結合条件のない結合であり、INNER JOIN ... ON 1=1
と同様に、mTableと入力のデカルト積を表示します。
パフォーマンスを向上させるために LATERAL
構文 を使用することもできますが、PostgreSQLは私の強力なカードではありません。