A 필드 (id, phase, name)와 B (fields : id, AID, APHASE, void)라는 두 개의 테이블이 있습니다.테이블 B에서 일치하는 레코드없이 테이블 A의 레코드를 보여주는 쿼리를 작성하는 방법은 무엇입니까?
나는
환경 0이 MySQL을하다 A.id = B.AID 및 A.phase = B.APHASE 및 무효 = 레코드를 제외한 모든 레코드를 표시해야합니다.
A 필드 (id, phase, name)와 B (fields : id, AID, APHASE, void)라는 두 개의 테이블이 있습니다.테이블 B에서 일치하는 레코드없이 테이블 A의 레코드를 보여주는 쿼리를 작성하는 방법은 무엇입니까?
나는
환경 0이 MySQL을하다 A.id = B.AID 및 A.phase = B.APHASE 및 무효 = 레코드를 제외한 모든 레코드를 표시해야합니다.
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)
두 번째는 실제로 작동 보장은 없습니다, 그냥 내 마음
는 I 추측 고정 : \
선택 * A, B
에서 어디
하지 (A.id = B.AID 및 A.phase = B.APHASE 보이드 = 0)
오전 받기 | 이 쿼리는 항상 A
정확히 1
또는 0
회에서 각 행을 반환 할 것을
안 좋은 해결책왔다. 일시적으로 단계와 무효를 무시하십시오. id = 1 인 테이블 A에 하나의 행이 있고 (id = 1, aid = 1), (id = 2, aid = 1), (id = 3, aid = 2)). 이 쿼리는 결과 행을 생성하지만 질문에 대답해서는 안됩니다. NOT EXISTS 쿼리는 행을 생성하지 않습니다 - 올바른 결과입니다. –
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
에서 여러 번 행을 반환 할 수 있습니다.
이러한 쿼리는 의미가 다르므로 올바른 쿼리를 선택하는 것이 성능이 아니라 유효성의 문제입니다.
성능 측면에서 MySQL
은 NESTED LOOPS
이외의 방식으로 조인 할 수 없기 때문에 항상 A
을 선두 테이블로 사용합니다. 그것이 첫 번째 일치하는 레코드를 발견로 EXISTS
는 항상 즉시 반환되므로
는 EXISTS
쿼리는 항상 더 효율적인 것보다 LEFT JOIN
최대 하나를 반환 비용으로, (그것은 적어도 나중에 LEFT JOIN
이상 반환해서) A
에서 녹음하십시오.
SELECT
id, phase, name
FROM A
WHERE NOT EXISTS
(SELECT id FROM B WHERE AID=A.id AND APHASE=A.phase AND void=0)
안녕하세요 - 두 테이블이 a.id = b.id에 가입합니까, 아니면 'a.id = b.aid'에 가입합니까? 질문은 이것에 대해 명확하지 않습니다. 그러나 당신의 대답은 id 행이 참여한다고 가정하는 반면, 명명은 그렇지 않다는 것을 암시합니다. –
나는 확실히 모르겠다. 그러나 나는 두 번째 진술이 그 질문을 묘사한다고 생각한다. 작동하지 않는 경우 올바르게 응답 할 수 있습니다. – knittl
"이미 완료했습니다"라는 요소가 있습니다 - 귀하의 답변이 선택되었습니다. 두 번째 옵션은 SELECT 목록에 A. *를 나열해야합니다. 결과의 카디널리티가 걱정됩니다 (작성자의 "답변"에 대한 설명 참조). 그리고 'AND void = 0'비트는 'NOT (...)'괄호 안에 있어야한다고 생각합니다. –