Как использовать псевдоним в запросе INSERT? - PullRequest
0 голосов
/ 05 января 2020

У меня есть следующее утверждение:

INSERT INTO room (room_class_id, beds_amount)
    VALUES 
    ((SELECT id FROM room_class WHERE class_name='STANDARD'), 2),
    ((SELECT id FROM room_class WHERE class_name='STANDARD'), 2),
    ((SELECT id FROM room_class WHERE class_name='STANDARD'), 3),
    ((SELECT id FROM room_class WHERE class_name='STANDARD'), 1),
    ...
    and 30+ rows looking like that

Как я могу использовать псевдоним для идентификатора класса комнаты, чтобы не выбирать его каждый раз? Когда я пытаюсь

INSERT INTO room (room_class_id, beds_amount)
    VALUES 
    ((SELECT id AS st_id FROM room_class WHERE class_name='STANDARD'), 2),
    (st_id, 2),
    (st_id, 3),
    (st_id, 1),

я получаю

ОШИБКА: столбец "st_id" не существует

Я использую PostgreSql 9.6.

Ответы [ 3 ]

2 голосов
/ 05 января 2020

Вы, кажется, хотите:

INSERT INTO room (room_class_id, beds_amount)
    SELECT rc.id, v.beds_amount
    FROM (VALUES ('Standard', 2),
                 ('Standard', 2),
                 ('Standard', 3),
                 ('Standard', 1),
                 ('Luxe', 2)
         ) v(class_name, beds_amount) JOIN
         room_class rc             
         USING (class_name);
1 голос
/ 05 января 2020

Это можно сделать с помощью перекрестного соединения запроса со значениями 2-го столбца, например:

INSERT INTO room(room_class_id, beds_amount)
SELECT rc.id, v.beds_amount
FROM (SELECT id FROM room_class WHERE class_name='STANDARD') rc
CROSS JOIN (VALUES (2), (2), (3), (1)) v (beds_amount);

См. demo .

0 голосов
/ 05 января 2020

Редактировать: обновленный ответ с дополнительной информацией, предоставленной ОП в комментарии.

Вы можете использовать WITH (пример здесь: http://sqlfiddle.com/#! 17 / 43b73 / 1/0 ):

WITH cte AS (
  SELECT id AS st_id, ARRAY[2,2,3,1] AS arr 
  FROM room_class 
  WHERE class_name='STANDARD'
  UNION ALL
  SELECT id AS st_id, ARRAY[1,2,3,4] AS arr 
  FROM room_class 
  WHERE class_name='LUXE'  
)
INSERT INTO room (room_class_id, beds_amount) 
    SELECT st_id, UNNEST(arr) FROM cte;
...