Sybase ASE中与SQL Anywhere的“on existing skip”等效的语句是什么?
Sybase ASE中与SQL Anywhere的“on existing skip”等效的语句是什么?
我太懂你这种困扰了——Sybase ASE确实没有SQL Anywhere里那种直接的on existing skip语法,但咱们完全可以用两种简单的写法实现跳过重复行插入的需求,给你一步步说清楚:
方法一:用NOT EXISTS子查询过滤已存在的记录
这是最直观的实现方式,核心思路就是在查询要插入的数据时,提前排除掉目标表中已经存在(匹配唯一索引IND的ID, TYPE, DATE组合)的行。直接修改你的原查询就行:
INSERT INTO TARGET_TABLE (ID, TYPE, DATE, BALANCE) SELECT ST.ID, ST.TYPE, ST.DATE, ST.BALANCE FROM SOURCE_TABLE ST, TABLE_X X, TABLE_Y Y WHERE ST.COLUMN_5 = X.COLUMN_3 AND X.COLUMN_7 = Y.COLUMN_8 AND Y.COLUMN_9 = 'some_value' -- 新增的过滤条件:只保留目标表中没有的记录 AND NOT EXISTS ( SELECT 1 FROM TARGET_TABLE TT WHERE TT.ID = ST.ID AND TT.TYPE = ST.TYPE AND TT.DATE = ST.DATE )
简单说,子查询会检查当前要插入的ID, TYPE, DATE组合是否已经在TARGET_TABLE里存在,要是有就直接过滤掉,根本不会走到插入步骤,自然就避免了唯一键冲突。
方法二:用LEFT JOIN + IS NULL筛选新行
另一种思路是通过左关联目标表,然后只保留那些在目标表中没有匹配的行,写法也很清晰:
INSERT INTO TARGET_TABLE (ID, TYPE, DATE, BALANCE) SELECT ST.ID, ST.TYPE, ST.DATE, ST.BALANCE FROM SOURCE_TABLE ST JOIN TABLE_X X ON ST.COLUMN_5 = X.COLUMN_3 JOIN TABLE_Y Y ON X.COLUMN_7 = Y.COLUMN_8 -- 左关联目标表,匹配唯一索引的字段 LEFT JOIN TARGET_TABLE TT ON TT.ID = ST.ID AND TT.TYPE = ST.TYPE AND TT.DATE = ST.DATE WHERE Y.COLUMN_9 = 'some_value' -- 只保留目标表中没有匹配到的行 AND TT.ID IS NULL
这里我把你原来的隐式关联改成了显式JOIN,可读性会更好,Sybase ASE完全支持这种写法。TT.ID IS NULL的作用就是挑出那些在目标表中找不到对应记录的行,也就是咱们真正需要插入的新数据。
小提示:如果你的数据量很大,这两种方法的性能差异不大,但要确保目标表的唯一索引IND是正常生效的,这样过滤查询会更快。要是之后你需要的是“存在就更新,不存在才插入”的逻辑,ASE有MERGE语句可以用,但你现在只需要跳过重复行的话,上面两种方法就足够啦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

