12

给定这样的数据库:

BEGIN TRANSACTION;
CREATE TABLE aTable (
a STRING,
b STRING);
INSERT INTO aTable VALUES('one','two');
INSERT INTO aTable VALUES('one','three');
CREATE TABLE anotherTable (
a STRING,
b STRING);
INSERT INTO anotherTable VALUES('one','three');
INSERT INTO anotherTable VALUES('two','three');
COMMIT;

我想做一些类似的事情

SELECT a,b FROM aTable
WHERE (aTable.a,aTable.b) IN
(SELECT anotherTable.a,anotherTable.b FROM anotherTable);

得到答案'一','三',但我得到“接近”,“:语法错误”

这在任何风格的 SQL 中都可能吗?(我正在使用 sqlite)

我犯了一个严重的概念错误吗?要不然是啥?

4

3 回答 3

20

如果您在 PostgreSQL 或 Oracle 中执行,您的代码就可以工作。在 MS SQL 上,不支持

用这个:

SELECT a,b FROM aTable
WHERE 
-- (aTable.a,aTable.b) IN -- leave this commented, it makes the intent more clear
EXISTS
(
    SELECT anotherTable.a,anotherTable.b -- do not remove this too, perfectly fine for self-documenting code, i.e.. tuple presence testing
    FROM anotherTable
    WHERE anotherTable.a = aTable.a AND anotherTable.b = aTable.b
);

[编辑]

没有意图的陈述:

SELECT a,b FROM aTable
WHERE     
EXISTS
(
    SELECT *
    FROM anotherTable
    WHERE anotherTable.a = aTable.a AND anotherTable.b = aTable.b
);

有点蹩脚,十多年来,MS SQL 仍然没有对元组的一流支持。IN tuple 构造比其类似的 EXISTS 构造更具可读性。顺便说一句,JOIN 也可以工作(tster 的代码),但是如果您需要更灵活和面向未来的东西,请使用 EXISTS。

[编辑]

说到 SQLite,我最近正在涉足它。是的,IN 元组不起作用

于 2009-09-25T01:27:20.247 回答
2

您可以使用联接:

SELECT aTable.a, aTable.b FROM aTable
JOIN anotherTable ON aTable.a = anotherTable.a AND aTable.b = anotherTable.b
于 2009-09-25T01:16:59.857 回答
2

另一种选择是使用串联将您的 2 元组变成单个字段:

SELECT a,b FROM aTable
WHERE (aTable.a||'-'||aTable.b) IN
(SELECT (anotherTable.a || '-' || anotherTable.b FROM anotherTable);

...请注意,如果 a 或 b 包含分隔符“-”,则可能会发生不好的事情

于 2015-03-12T18:29:18.790 回答