복붙노트

[SQL] 절에 SQL에 튜플을 사용하여

SQL

절에 SQL에 튜플을 사용하여

이 같은 데이터베이스 감안할 때 :

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의 맛에 수 있습니까? (I SQLite는을 사용하고 있습니다)

나는 총 개념 오류를 만드는 건가요? 또는 무엇을?

해결법

  1. ==============================

    1.당신은 PostgreSQL을 또는 Oracle에서 할 경우 코드가 작동합니다. MS SQL에서,이 지원되지 않습니다

    당신은 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보다 훨씬 더 읽을 수 있습니다. BTW, 또한 (tster의 코드) 작동하지만 더 유연 뭔가 미래 증거를 필요로하는 경우, 사용이 존재하는 가입.

    [편집하다]

    SQLite는의 말하기, 내가 최근에 취미 삼아하고있다. 그래, 인디애나는 일을하지 않는 튜플

  2. ==============================

    2.당신이 사용할 수있는 가입 :

    당신이 사용할 수있는 가입 :

    SELECT aTable.a, aTable.b FROM aTable
    JOIN anotherTable ON aTable.a = anotherTable.a AND aTable.b = anotherTable.b
    
  3. ==============================

    3.또 다른 대안은 하나의 필드로 2 튜플을 만들기 위해 연결을 사용하는 것입니다 :

    또 다른 대안은 하나의 필드로 2 튜플을 만들기 위해 연결을 사용하는 것입니다 :

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

    ... 단지 A 또는 B가 구분 기호를 포함하면 나쁜 일이 일어날 수 있다는 것을 인식 '-'

  4. from https://stackoverflow.com/questions/1474964/using-tuples-in-sql-in-clause by cc-by-sa and MIT license