2011-09-29 5 views
0

다른 사람들이 함께 모으는 MySQL 데이터베이스에서 작업하기 시작했습니다.이를 정리하려고합니다. 내 문제에 대한 세 가지 관련 테이블 - 경매를 나열하는 테이블, 각 경매에서 판매 된 제비를 나열하는 테이블 및 각 로트의 지불 일정을 나열한 테이블이 있습니다.다중 테이블 MySQL 데이터베이스에서 누락 된 행 찾기

경매 테이블은 각 경매를 식별하기 위해 기본 키를 사용하며, 각 로트는 경매와 식별하기 위해이 키를 가지고 있습니다. 마찬가지로, 각 로트는 서로 다른 키를 가지고 있는데, 각 지불은 그것을 로트로 식별하기 위해 사용합니다. 각 경매에는 최소한 하나의 로트가 있어야하며 각 로트에는 최소한 하나의 지불이 있어야합니다. 로트 테이블에 행이없는 로트에는 지불을하지 않아야하며, 경매 테이블에 행이없는 경매에는 로트를 첨부해서는 안됩니다. 이 규칙을 어기는 행을 찾을 수있는 쿼리를 작성하려고합니다. 예를 들어 많은 테이블에 누락 된 행이 있거나 많이 첨부되지 않은 추가 지불이 있습니다.

현재 관련 테이블에 언급 된 롯트/경매의 수를 제공하는 고유 수 쿼리를 수행하고 있지만 그 수와 일치하지 않으면 어떤 테이블이 누락되었는지 찾는 데 도움이되지 않습니다. 누락 된 행을 찾는 데 사용할 수있는 쿼리가 있습니까?

감사합니다.

답변

2

관련 테이블에서 키를 확인할 수 있습니다. 이와 같은

Select a.* from Auction a 
Left Join Lot l on l.key = a.key 
where l.key is null 

또는

select * from Auction a 
where a.key not in (select key from lot) 

무언가가 당신을 도울 것입니다. 테이블 및 열 이름을 변경하여 일치시키고 다른 적절한 경우에 대해 스크립트해야하지만 논리는 비슷해야합니다. 이것이 도움이되기를 바랍니다.

+0

또는 '존재하지 않음 (SELECT * FROM Lot = Key. Auction.key)'. 필자가 아는 한 일반적으로 안티 세미 조인을 수행하는 가장 좋은 방법입니다. LEFT JOIN 옵션은 종종 최악입니다. 이것이 MySQL에 적합한 지 여부는 잘 모르겠습니다. 큰 샘플 데이터 세트에서 세 가지 모두를 시험해 볼 가치가 있습니다. – MatBailie

+1

나는 쿼리 최적화가 그것을 처리했으며 Not In 및 Left Join이 거의 동일하게 수행되고 not exist 메서드가 약간의 경우 효율적이지 않다는 인상을 받았다. 인덱스가 관련되어있을 때는 언급 할 필요가 없습니다. rescource : http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/ –

0

뭔가 같은, (경매 구별 (auction.pk를 선택)) NOT IN을 lot.fk 많은 에서

SELECT lot.pk

당신에게 비 존재하지 않는 경매에 부착 된 많이 줄 것이다, 귀하의 다른 상황에 맞게 수정하십시오.