在通过Sub Query排除行时,为什么在SQLite中收到意外的结果集?

时间:2016-03-09 12:27:51

标签: sqlite

在我的工作中,我们遇到了SQLite查询中的一个错误,它返回了奇怪的结果。查询看起来有点像这样:

SELECT * FROM TableA  
WHERE TableA.ID NOT IN 
(
    SELECT TableA.ID   -- Table A
    FROM TableB        -- Table B
);

此查询似乎返回的是TableA中不在TableB中的所有结果。

你可以试试这个:

CREATE TABLE `TableA` (
    `ID`    INTEGER,
    PRIMARY KEY(ID)
);

CREATE TABLE `TableB` (
    `ID`    INTEGER,
    PRIMARY KEY(ID)
);

INSERT INTO TableA (ID)
values (1),(2),(3);

INSERT INTO TableB (ID)
values (1),(2);

在这种情况下,上面的查询将返回3(因为3不在表B中)。

我想知道的是这里实际发生了什么。这个查询是如何有效的,为什么它在A中返回结果,而不是在B?

我个人希望这个查询不会返回任何结果。我在Microsoft SQL Server中尝试了相同的设置和查询,其中调用上述查询将不会返回任何结果。

由于

编辑:

如评论中所述,在子查询中,预期和正确的查询应该是SELECT ID FROM TableB,这就是找到奇怪行为的原因。

1 个答案:

答案 0 :(得分:1)

查询应该不返回任何结果。 这是a bug in SQLite,在SQLite 3.12.0中将是fixed