Cross-product between table column and input values
In other RDBMS (like SQL Server before 2008 - as per Paul's comment) one might cross join to a subquery with UNION ALL SELECT
, but there are more convenient and efficient options in Postgres.
And you don't need a CTE for this. You can use it, but it has no performance benefit.
Provide a set with
VALUES
:VALUES
computes a row value or set of row values specified by value expressions. It is most commonly used to generate a "constant table" within a larger command, but it can be used on its own.SELECT t.i, m.col1 FROM mTable m CROSS JOIN (VALUES (1), (2)) t(i);
Provide an array and
unnest()
2a. with an array constructor:
SELECT i, m.col1 FROM mTable m CROSS JOIN unnest (ARRAY[1,2]) i;
2b. With an array literal:
SELECT i, m.col1 FROM mTable m CROSS JOIN unnest ('{1,2}'::int[]) i;
Add ORDER BY i, m.col1
if you need the sort order in your result.
About row and array syntax:
- Array of strings when updating a field
What you're describing is a CROSS JOIN
.
SELECT input.n, mTable.column
FROM mTable, (
SELECT 1 AS n
UNION ALL
SELECT 2 AS n) AS input;
.. or, in more modern SQL notation,
SELECT input.n, mTable.column
FROM mTable
CROSS JOIN (
SELECT 1 AS n
UNION ALL
SELECT 2 AS n) AS input;
It's essentially a join without join conditions and it displays the cartesian product of mTable and input, similar to INNER JOIN ... ON 1=1
.
You may also be able to use the LATERAL
construct for potentially better performance, but PostgreSQL isn't my strong card.