在sql in子句中使用元组

mr *_*dar 12 sql row-value-expression

给定这样的数据库:

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;
Run Code Online (Sandbox Code Playgroud)

我想做一些事情

SELECT a,b FROM aTable
WHERE (aTable.a,aTable.b) IN
(SELECT anotherTable.a,anotherTable.b FROM anotherTable);
Run Code Online (Sandbox Code Playgroud)

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

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

我是否犯了严重的概念错误?或者是什么?

Mic*_*uen 19

如果你在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
);
Run Code Online (Sandbox Code Playgroud)

[编辑]

没有说明意图:

SELECT a,b FROM aTable
WHERE     
EXISTS
(
    SELECT *
    FROM anotherTable
    WHERE anotherTable.a = aTable.a AND anotherTable.b = aTable.b
);
Run Code Online (Sandbox Code Playgroud)

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

[编辑]

谈到SQLite,我最近在涉及它.是的,IN元组不起作用

  • @tster - 我没有看到任何混乱的根源 (4认同)