【问题标题】:How to use alias in INSERT query?如何在 INSERT 查询中使用别名?
【发布时间】:2020-04-23 09:46:19
【问题描述】:

我有以下声明:

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

如何使用房间类 ID 的别名来避免每次都选择它? 当我尝试时

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。

【问题讨论】:

    标签: sql postgresql select insert alias


    【解决方案1】:

    你似乎想要:

    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);
    

    【讨论】:

      【解决方案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

      【讨论】:

      【解决方案3】:

      编辑:使用 OP 在评论中提供的附加信息更新答案。

      您可以使用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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-16
        • 1970-01-01
        • 2021-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-07
        相关资源
        最近更新 更多