【问题标题】:(One table) insert rows(一张表)插入行
【发布时间】:2019-10-08 12:58:40
【问题描述】:

这个问题是this one的延续。

我有下表egr

+---------+------------+
|  offid  |  groupid   |
+---------+------------+
|       1 | 101        |
|       1 | 202        |
|       2 | 202        |
|       2 | 404        |
+---------+------------+

我想插入 offid 2 没有的缺失 groupid(与 offid 1 相比)。结果是:

+---------+------------+
|  offid  |  groupid   |
+---------+------------+
|       1 | 101        |
|       1 | 202        |
|       2 | 202        |
|       2 | 404        |
|       2 | 101        |   --> new row to insert
+---------+------------+

我的尝试,基于我的另一个问题的答案(不起作用):

INSERT INTO egr (offid, groupid)
  SELECT 2, egr1.groupid
  FROM egr AS egr1 
  WHERE egr1.offid = 1
  AND NOT EXISTS
    (select 1
                  from egr e2
                  where e2.groupid = egr1.groupid and 
                        e2.offid in (1, 2) and
                        e2.offid <> egr1.offid 
                 );

【问题讨论】:

    标签: sql postgresql sql-insert insert-select


    【解决方案1】:

    使用except 操作符可能更容易实现:

    INSERT INTO egr (offid, groupid)
    SELECT 2, groupid
    FROM   egr
    WHERE  offid = 1
    EXCEPT
    SELECT 2, groupid
    FROM   egr
    WHERE  offid = 2
    

    【讨论】:

    • 是的,这行得通:dbfiddle.uk/…(在您的 SQL 小提琴中也是如此:sqlfiddle.com/#!15/ef3f0/3)虽然我会省略 WHERE offid = 1part,因为您实际上可能有超过 2 个值。跨度>
    • @S-Man OP 的要求是向offid=2 插入offid=1 具有和没有的值。如果在 where 子句中省略它,则可以插入来自 offid='something else' 的值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2021-01-24
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    相关资源
    最近更新 更多