【问题标题】:Can I use Select from Insert into table function in sql?我可以在sql中使用Select from Insert into table函数吗?
【发布时间】:2020-04-23 13:36:45
【问题描述】:

我得到了以下数据集:

CREATE temp TABLE XXX (DATE TEXT, PRICE INTEGER);
INSERT INTO XXX VALUES 
('2019-04-27 01:00', 1), ('2019-04-27 02:30', 3), ('2019-04-27 18:00',2), 
('2019-04-28 17:00', 2), ('2019-04-28 21:00', 5), 
('2019-04-29 17:00',50), ('2019-04-29 21:00',10), 
('2019-04-30 17:00',10), ('2019-04-30 21:00',20), 
('2019-05-01 17:00',40), ('2019-05-01 21:00',10), 
('2019-05-02 17:00',10), ('2019-05-02 21:00', 6);

然后我尝试使用此查询从表 XXX 中获取 2 行最近的行,并将它们与 date + 1 天和相同的 price 值添加到表 XXX。因此,应添加日期为 05-03 的行。

with A as (
select * from XXX
order by DATE DESC),

B as (select * from (insert into A (DATE, PRICE),
select * from A
limit 2))

select * from B

这里出现错误:

error at or near "insert"

如何解决这个问题?

【问题讨论】:

  • 当我理解了这个问题时,我冒昧地澄清一下。如果我记错了请调整。

标签: sql postgresql sql-insert date-arithmetic


【解决方案1】:

这是你想要做的吗?

with i as (
       insert into A (DATE, PRICE)
           select * 
           from XXX
           order by DATE TEXT DESC
           limit 2
           returning *
      )
select *
from i;

【讨论】:

  • 你的意思是 ''' 与 A as ( select * from XXX order by DATE TEXT DESC),i as ( insert into A (DATE, PRICE) select * from XXX order by DATE TEXT DESC limit 2返回 * ) 从 i 中选择 *;) ?
  • @JohnMayer 。 . .您真的要插入 CTE 吗?这是不允许的。
  • 是的,我想要。还有其他选择如何进行这种操作吗?可能是创建 2 个 CTE 然后使用 UNION,但我不知道如何。
  • @JohnMayer 。 . .您只能插入到表格或某些视图中。
  • 现在我明白了。我通过在 select 中使用 CTE A 和 B 来解决它,然后使用 UNION ALL 从这两个 CTE 创建一个表。但是,如何将 1 天添加到表 B? SELECT add_date(DATE),价格没有帮助
【解决方案2】:

认为,你只是想:

INSERT INTO xxx (date, price)
SELECT date + 1  -- adding a day to a date
     , price
FROM   xxx
ORDER  BY date DESC
LIMIT  2;

这会根据date 列获取最新的两行,添加一天并插入新行。

可以选择附加 RETURNING * 以返回您刚刚插入的行。

如果...可能会损坏

  • ...date 列不是date 类型(而是不要使用基本类型名称作为标识符)
  • ...date 未定义 NOT NULL
  • ...最近一天不完全是两行。

date + integer 操作将天数添加到 Postgres 中的日期。相关:

【讨论】:

    猜你喜欢
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多