From: | Andrew Gierth <andrew(at)tao11(dot)riddles(dot)org(dot)uk> |
---|---|
To: | stan <stanb(at)panix(dot)com> |
Cc: | pgsql-general(at)lists(dot)postgresql(dot)org |
Subject: | Re: Inserting multiple rows wtih a SELECt in the values clause |
Date: | 2019-10-15 14:28:40 |
Message-ID: | 871rveytrt.fsf@news-spur.riddles.org.uk |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
>>>>> "stan" == stan <stanb(at)panix(dot)com> writes:
stan> I suspect this may be because the SELECT in the values clause
stan> returns multiple rows?
Understand this: VALUES is really just a special form of SELECT that
returns only the specific rows that you tell it to construct. Every
single row returned by a VALUES clause is separately constructed.
i.e. VALUES (...),(...); will return exactly two rows regardless of
what is inside the (...). VALUES (...); is always exactly one row.
And so on.
The general form of INSERT is actually:
INSERT INTO table(columns) <query>
where <query> is any valid query returning any number of rows. The use
of VALUES for the <query> is just a convenient shorthand for cases where
the exact number of rows to be inserted, and their content, is known in
advance.
So, if you're inserting some set of rows generated from a query, the
word VALUES should not appear in the top-level statement. What you want
is:
INSERT INTO rate(employee_key, project_key, work_type_key, rate)
SELECT employee.employee_key,
project.project_key,
work_type.work_type_key,
1 as rate
FROM employee
CROSS JOIN project
CROSS JOIN work_type;
--
Andrew (irc:RhodiumToad)
From | Date | Subject | |
---|---|---|---|
Next Message | Moreno Andreo | 2019-10-15 15:43:04 | Re: Pg11 -- MultiXactId xxxx has not been created yet -- apparent wraparound |
Previous Message | Geoff Winkless | 2019-10-15 14:25:00 | Re: SELECT returnig a constant |