web-dev-qa-db-ja.com

テーブルの列と入力値の間のクロス積

SQLクエリを記述できないようです。このクエリは、テーブルの列と指定された入力値のセットの間のクロス積を計算します。

以下に沿ったもの:

WITH {1,2} as Input
Select *
From mTable.column, Input

mTable.column値を含む3および4、それは返すべきです:

1,3
1,4
2,3
2,4

これを達成する方法はありますか?

5
user695652

他のRDBMS(2008年より前のSQL Serverのような-Paulのコメントによる)では、サブクエリに_UNION ALL SELECT_でクロス結合することができますが、Postgresにはより便利で効率的なオプションがあります。

そして、あなたはこれのためにCTEを必要としません。使用できますが、パフォーマンス上の利点はありません。

  1. setVALUES を指定します:

    VALUESは、値式で指定された行値または行値のセットを計算します。より大きなコマンド内で「定数テーブル」を生成するために最も一般的に使用されますが、それ自体で使用することもできます。

    _SELECT t.i, m.col1
    FROM   mTable m
    CROSS  JOIN (VALUES (1), (2)) t(i);
    _
  2. 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_を追加します。

行と配列の構文について:

9

あなたが説明しているのは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は私の強力なカードではありません。

3