2009-09-07 2 views

답변

2
SELECT * 
    FROM `A` 
LEFT JOIN `B` 
     ON `A`.`id` = `B`.`id` 
    WHERE NOT (`A`.`id` = `B`.`AID` AND `A`.`phase` = `B`.`APHASE` 
       AND `void` = 0) 

또는 :

SELECT * 
    FROM `A` 
LEFT JOIN `B` 
     ON NOT (`A`.`id` = `B`.`AID` 
       AND `A`.`phase` = `B`.`APHASE` 
       AND `void` = 0) 

두 번째는 실제로 작동 보장은 없습니다, 그냥 내 마음

+0

안녕하세요 - 두 테이블이 a.id = b.id에 가입합니까, 아니면 'a.id = b.aid'에 가입합니까? 질문은 이것에 대해 명확하지 않습니다. 그러나 당신의 대답은 id 행이 참여한다고 가정하는 반면, 명명은 그렇지 않다는 것을 암시합니다. –

+0

나는 확실히 모르겠다. 그러나 나는 두 번째 진술이 그 질문을 묘사한다고 생각한다. 작동하지 않는 경우 올바르게 응답 할 수 있습니다. – knittl

+0

"이미 완료했습니다"라는 요소가 있습니다 - 귀하의 답변이 선택되었습니다. 두 번째 옵션은 SELECT 목록에 A. *를 나열해야합니다. 결과의 카디널리티가 걱정됩니다 (작성자의 "답변"에 대한 설명 참조). 그리고 'AND void = 0'비트는 'NOT (...)'괄호 안에 있어야한다고 생각합니다. –

0

는 I 추측 고정 : \

선택 * A, B

에서 어디

하지 (A.id = B.AID 및 A.phase = B.APHASE 보이드 = 0)

오전 받기 | 이 쿼리는 항상 A 정확히 1 또는 0 회에서 각 행을 반환 할 것을

+1

안 좋은 해결책왔다. 일시적으로 단계와 무효를 무시하십시오. id = 1 인 테이블 A에 하나의 행이 있고 (id = 1, aid = 1), (id = 2, aid = 1), (id = 3, aid = 2)). 이 쿼리는 결과 행을 생성하지만 질문에 대답해서는 안됩니다. NOT EXISTS 쿼리는 행을 생성하지 않습니다 - 올바른 결과입니다. –

1
SELECT * 
FROM A 
WHERE NOT EXISTS 
     (
     SELECT NULL 
     FROM B 
     WHERE b.aid = a.id 
       AND b.aphase = a.phase 
       AND b.void = 0 
     ) 

참고.

B (aid, aphase)UNIQUE이 아닌 경우 A에서 여러 번 행을 반환 할 수 있습니다.

이러한 쿼리는 의미가 다르므로 올바른 쿼리를 선택하는 것이 성능이 아니라 유효성의 문제입니다.

성능 측면에서 MySQLNESTED LOOPS 이외의 방식으로 조인 할 수 없기 때문에 항상 A을 선두 테이블로 사용합니다. 그것이 첫 번째 일치하는 레코드를 발견로 EXISTS는 항상 즉시 반환되므로

EXISTS 쿼리는 항상 더 효율적인 것보다 LEFT JOIN 최대 하나를 반환 비용으로, (그것은 적어도 나중에 LEFT JOIN 이상 반환해서) A에서 녹음하십시오.

+0

'NOT EXISTS'는 꽤 느릴 수 있습니다. – knittl

+0

'@knittl' :'MySQL' (즉, MySQL)에서는 LEFT JOIN (즉, LEFT JOIN)보다 더 느릴 수 없습니다. – Quassnoi

2
SELECT 
    id, phase, name 
FROM A 
WHERE NOT EXISTS 
    (SELECT id FROM B WHERE AID=A.id AND APHASE=A.phase AND void=0) 
관련 문제