2014-06-20 2 views
0

내가 이런 식으로 쿼리를 구성 할 필요가 다른 하위 쿼리와 같은 답변 제공하는 경우 :SQLite는 검사가 하위 쿼리

SELECT * FROM table1 AS t1 WHERE (
    (SELECT column2 FROM table1 WHERE column1=t1.column1)!=(SELECT column2 FROM table1 WHERE column1=1) 
) 

을 그러나 문제는 SQLite는이 하위 쿼리의 첫 번째 결과를 확인한다는 것입니다. (1,2,3)SELECT column2 FROM table1 WHERE column1=1가 제공 (1,2,3,4) SQLite는 만 1!=1하지 (1,2,3)!=(1,2,3,4) 확인합니다 :

나는 SELECT column2 FROM table1 WHERE column1=t1.column1는 다음과 같은 결과를 얻을 수 있다면 것을 의미한다.

나는 prevoius 두 쿼리는 같은 행 (두 번째에서, 즉 처음부터 (1,2,3)(1,2,3))

내 테이블의 예를주는 경우 행을 필터링해야합니다

id | column1 | column2 | ... 
1 |  1 |  1 | ... 
2 |  1 |  2 | ... 
3 |  1 |  3 | ... 
4 |  2 |  1 | ... 
5 |  2 |  2 | ... 
6 |  2 |  3 | ... 
7 |  2 |  4 | ... 
8 |  3 |  1 | ... 
9 |  3 |  2 | ... 
10 |  3 |  3 | ... 

그리고 필요 id=4에서 행 (1 열 1 값의 경우 1 열과 동일한 열 2 값이 없음) 에 행 가져 오기

답변

2

Y compound select statements는 : 서로 하위 쿼리를 감산하고 열이 남아 있는지 확인 :

SELECT * 
FROM table1 AS t1 
WHERE EXISTS (SELECT column2 FROM table1 WHERE column1=t1.column1 
       EXCEPT 
       SELECT column2 FROM table1 WHERE column1=1) 
    OR EXISTS (SELECT column2 FROM table1 WHERE column1=1 
       EXCEPT 
       SELECT column2 FROM table1 WHERE column1=t1.column1) 

달리, 개별 행과 동일한 동작을 수행 어떤 행이 다른 서브 쿼리의 대응이없는 경우 서브 쿼리가 다른 :

SELECT * 
FROM table1 AS t1 
WHERE EXISTS (SELECT column2 
       FROM table1 AS t2 
       WHERE column1 = t1.column1 
       AND NOT EXISTS (SELECT 1 
           FROM table1 AS t3 
           WHERE column2 = t2.column2 
            AND column1 = 1)) 
    OR EXISTS (SELECT column2 
       FROM table1 AS t2 
       WHERE column1 = 1 
       AND NOT EXISTS (SELECT 1 
           FROM table1 AS t3 
           WHERE column2 = t2.column2 
            AND column1 = t1.column1)) 

가 (당신이 필요한 인덱스가있는 경우 두 번째 쿼리가 더 효율적일 수 있습니다.)

+0

고마워요! 그것은 작동합니다! – user2160982