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元组不起作用