如何在具有匹配列的另一个表上插入 - WHERE NOT EXISTS?

Posted

技术标签:

【中文标题】如何在具有匹配列的另一个表上插入 - WHERE NOT EXISTS?【英文标题】:How to INSERT - WHERE NOT EXISTS on another table with a matching column? 【发布时间】:2017-08-07 20:38:59 【问题描述】:

我正在寻找类似于以下内容的 SQL 语句:

INSERT INTO some_table
  (a, b, c)
VALUES
  ('a', 'b', 'c')
RETURNING
   a
WHERE NOT EXISTS
(
  SELECT
    some_column
  FROM
    another_table
  WHERE
    some_cond='is_true'
);

因为WHERE NOT EXISTS 后面是SELECT FROM 而不是INSERT INTO,所以上面的内容不起作用。只有当另一个表上的 select 语句不返回任何内容时,如何才能插入到表中?

编辑2:

更改了数据库架构以包含其他表上的匹配列,而不是匹配的“待插入”列上的空约束,以使用带有选择的子查询来获得预期的功能并使用 @Isaiah3015 建议的内容。

【问题讨论】:

也看到这个问题:***.com/questions/12591392/… 【参考方案1】:

最好的方法是使用您想要选择的内容创建一个 INSERT sytanx

INSERT INTO table ( column1, column2, column 3, etc)
SELECT column1, column2, column3, etc from table where condition = 'whatever 
condition you want inserted into the table'

【讨论】:

两个表对我来说是不同的,它们没有匹配的列。 如果他们根本没有任何匹配的数据,你如何确定 NOT IN 或 NOT EXIST?然后你的第一个表就是 SELECT INTO。没有必要不存在。 假设 SELECT INTO 可以将数据从一个表复制到另一个表中,我不需要该功能。我不确定你的意思 - 如何确定.. NOT EXIST 的目的是排除或包含特定数据(取决于您如何看待它)。例如:Table1 的 ID 为 1,2,3,4,5,6,table2 的 ID 为 1,2,3。如果你写 INSERT INTO table () Select ID FROM Table1 where ID NOT EXIST / NOT IN(Select ID from table2),将插入的值是4,5,6。因为这些是 Table2 中不存在的值。如果表 1 和表 2 之间没有相关性(如您所说),您如何确定要排除的内容?【参考方案2】:

我想你想要insert . . . select:

INSERT INTO some_table(a, b, c)
    SELECT 'a', 'b', 'c'
    FROM dual
    WHERE NOT EXISTS (SELECT some_column
                      FROM another_table
                      WHERE some_cond = 'is_true'
                     )
RETURNING a;

【讨论】:

Table 'Dual' 在我的情况下没有'a'、'b'、'c'。它们是不同的表,没有任何匹配的列。 @RobertC.Holland 。 . . 'a''b''c' 在您的问题中是常量字符串,在此答案中它们是常量字符串。这与dual中的列无关。

以上是关于如何在具有匹配列的另一个表上插入 - WHERE NOT EXISTS?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用具有多个 GROUP BY、子查询和 WHERE IN 在大表上的查询来优化查询?

一个表上具有不同列的 SQL 连接

在具有“已更改”列的表上使用 activerecord 会引发错误

如何从Oracle中的另一个子查询中选择具有最大列的行

Bootstrap:如何获得具有 100% 高度的另一列的列

将具有两个日期列的一个数据框与另一个具有两个日期列的数据框合并