【问题标题】:SELECT statements as INSERT parameters along with other parametersSELECT 语句作为 INSERT 参数以及其他参数
【发布时间】:2021-01-28 06:13:44
【问题描述】:

两个 SELECT 语句各只返回一个标量数据。我希望将它们作为 INSERT 语句的前两个参数传递。但是它在第二个 SELECT 语句之后抛出一个错误,指出无效的逗号。我在这里做错了什么?

INSERT INTO messages(src_id, tar_id, body, time)
         SELECT id FROM chatters WHERE (uname = 'adnan'),
       SELECT id FROM chatters WHERE (uname = 'john'), 'Hello John', '1971-12-16';

【问题讨论】:

  • 如果用户名不存在,您是要插入带有NULL 值的行还是不插入行?

标签: sql postgresql sql-insert


【解决方案1】:

把整个SELECT放在括号里:

INSERT INTO messages(src_id, tar_id, body, time)
   VALUES
  ( ( SELECT id FROM chatters WHERE (uname = 'adnan') ),
   ( SELECT id FROM chatters WHERE (uname = 'john') ),
   'Hello John',
   '1971-12-16' );

【讨论】:

  • 错误:'adnan' 后的第二个括号后有逗号
  • 抱歉忘记VALUES
【解决方案2】:

您可以按如下方式使用insert into .. select

INSERT INTO messages(src_id, tar_id, body, time)
   SELECT max(case when uname = 'adnan' then id end),
          max(case when uname = 'john' then id end),
          'Hello John',
          '1971-12-16'
     FROM chatters 
    where uname in ('adnan','john');

【讨论】:

  • 对不起,如果我没有说清楚。 INSERT 语句的最后两个参数应该是独立的,与 SELECT 语句无关。您的代码是否承认这一点?
  • 是的,它们是独立的。
  • 您也可以使用 FILTER,以避免出现 CASE: MAX(id) FILTER(WHERE uname = 'adnan')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多