【问题标题】:INSERT INTO a table comparing two other tables using Not EXISTSINSERT INTO 使用 Not EXISTS 比较其他两个表的表
【发布时间】:2020-04-18 10:03:14
【问题描述】:

我有 3 张桌子:

  • Server_db_relation
  • 数据库列表
  • DatabaseList_Archive

目标是根据ServerName 和DatabaseName 列中的值比较表Server_db_relation 和DatabaseList。如果值在Server_db_relation 表中不存在,但在DatabaseList 中存在,则它应该将DatabaseList 中的整行插入DataList_Archive(这两个表的结构相同)。

此外,如果可能,该行已插入到DatabaseList_Archive,然后从DatabaseList 中删除记录。

INSERT INTO DatabaseList_Archieve (Column1, Column2...)
    SELECT * 
    FROM DatabaseList
    WHERE NOT EXISTS (SELECT 1 
                      FROM DabaseList, Server_db_relation 
                      WHERE DatabaseList.ServerName = Server_db_relation.ServerName 
                        AND DatabaseList.DatabaseName = Server_db_relatio.[Database])

我没有收到任何语法错误,但没有任何行受到影响。我添加了 2 个我知道存在于 DatabaseList 而不是 Server_db_relation 的测试行。

【问题讨论】:

  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 多年前),不鼓励使用它
  • @marc_s 非常感谢您指出并链接。生病改变它,它适用于代码的哪一部分?

标签: sql sql-server database syntax sql-insert


【解决方案1】:

您需要关联子查询:

INSERT INTO DatabaseList_Archieve (Column1, Column2...)
    SELECT dbl.col1, dbl.col2, . .  
    FROM DatabaseList dbl
    WHERE NOT EXISTS(SELECT 1 
                     FROM Server_db_relation sdb 
                     WHERE dbl.ServerName = sdb.ServerName AND 
                           dbl.DatabaseName = sdb.[Database]
                    );

注意:我已经声明了表别名以使查询易于准备和编写列名或表名(它来自哪里)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-21
    • 2012-03-02
    • 1970-01-01
    • 2016-08-18
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    相关资源
    最近更新 更多