表列和输入值之间的叉积

use*_*652 9 postgresql join set-returning-functions

我似乎无法写一个 SQL查询来计算表列和一组给定输入值之间的叉积。

类似的东西:

WITH {1,2} as Input
Select *
From mTable.column, Input
Run Code Online (Sandbox Code Playgroud)

随着mTable.column包含值34,它应该返回:

1,3
1,4
2,3
2,4
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这一目标?

Erw*_*ter 15

在其他 RDBMS(如 2008 年之前的 SQL Server - 根据 Paul 的评论)中,可能会使用 交叉连接到子查询UNION ALL SELECT,但 Postgres 中有更方便和有效的选项。

并且您不需要 CTE。您可以使用它,但它没有性能优势。

  1. 提供了一套具有VALUES

    VALUES计算由值表达式指定的行值或行值集。它最常用于在更大的命令中生成“常量表”,但它也可以单独使用。

    SELECT t.i, m.col1
    FROM   mTable m
    CROSS  JOIN (VALUES (1), (2)) t(i);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 提供一个数组unnest()

    2a. 使用数组构造函数

    SELECT i, m.col1
    FROM   mTable m
    CROSS  JOIN unnest (ARRAY[1,2]) i;
    
    Run Code Online (Sandbox Code Playgroud)

    2b. 使用数组文字:

    SELECT i, m.col1
    FROM   mTable m
    CROSS  JOIN unnest ('{1,2}'::int[]) i;
    
    Run Code Online (Sandbox Code Playgroud)

ORDER BY i, m.col1如果您需要结果中的排序顺序,请添加。

关于行和数组语法: