我正在寻找一种将行插入 InterBase 表中的方法(如果表中尚不存在这些行)。我不能保证 InterBase 表一开始就不为空。
在 SQL Server 中,我可以执行类似于以下脚本示例中的 WHERE NOT EXISTS 的操作,其中无论注释行是否未注释,输出都是相同的。在 SQL Server 中,即使第一个 INSERT INTO 也被注释掉,脚本仍会继续运行。
CREATE TABLE #Table(A VARCHAR(3), B INT, C INT);
INSERT INTO #Table(A, B, C) VALUES ('a1', 1, 11);
--INSERT INTO #Table(A, B, C) VALUES ('a2', 2, 12);
INSERT INTO #Table(A, B, C)
SELECT 'a2', 2, 12
WHERE NOT EXISTS (
SELECT 1
FROM #Table WHERE A='a2' AND B=2 AND c=12)
SELECT * FROM #Table;
DROP TABLE #Table;
我如何在 InterBase 中做同样的事情?
注意,此脚本中嵌入了第二个问题,因为我知道 InterBase 中“SELECT”的语法需要“FROM”,并且“SELECT 'a2', 2, 12”行中没有“FROM”,我很好奇处理这个问题的最佳方法是来自有 InterBase 经验的人。
在我提出上面的问题后,事实证明它比我的思维路径要容易得多。临时表上的“LEFT JOIN”看起来很有效,获取一行的方法就是使用系统表。像这样的东西:
INSERT INTO Tmp(A, B, C)
SELECT 'a2', 2, 12
FROM RDB$DATABASE LEFT JOIN
Tmp ON Tmp.A='a2' AND Tmp.B=2 AND Tmp.C=12
WHERE Tmp.B IS NULL
ROWS 1;