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);

答え 'one','three' を取得するには、「near ",": syntax error」を取得しています

これは 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
);

10 年以上の間、MS SQL はまだタプルに対する最高のサポートを提供していません。IN タプル構造は、類似の 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

もう 1 つの方法は、連結を使用して 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 に答える