2012-11-01 4 views
0

가정하는 두 개의 테이블이 있습니다 조인 된 테이블에서 하나의 행을 선택하는 하위 쿼리에 가입은 MySQL이

Location PartNum Descrip 
-------- ------- -------- 
Whse1 abc  Frobbitz 
Whse2 abc  Frobbitz 
Whse3 def  Widget 
Whse3 def  Widget 

테이블 상태 :

대부분의 경우
Location PartNum Status 
--------- ------- -------------- 
*Default* abc  Ready To Ship 
*Default* def  Ready To Ship 
Whse1  abc  Backordered 

, 기본 상태를 사용해야합니다. 이이 일을 가장 효율적으로 (또는 적어도 합리적으로 효율적으로) 방법,

SELECT p.Location,p.PartNum,p.Descrip,s.Status FROM Parts p 
LEFT JOIN Status s ON s.PartNum=p.PartNum AND 
s.Location = (SELECT MAX(Location) FROM Status s1 
WHERE s1.PartNum=p.PartNum AND s1.Location 
IN('*Default*',p.Location)) 

질문은 :

이 상태를 얻으려면, 쿼리처럼 보일 수 있습니다? 실제 응용 프로그램에는 단일 쿼리에서 최대 7 개의 테이블이 조인됩니다.

+0

내 질문에 비해 더 나은 방법 아래에있는 세 가지 답변 중 하나가 있습니까? 결국, 제 질문은 "가장 효율적인 (또는 적어도 합리적으로 효율적인) 방법입니까?" –

답변

0

난 당신이 아래 Order byLimit 1을 사용할 수 있다고 생각 : *Default* 가정

SELECT p.Location,p.PartNum,p.Descrip,s.Status FROM Parts p 
    LEFT JOIN Status s ON s.PartNum=p.PartNum AND 
    s.Location = (SELECT Location FROM Status s1 
     WHERE s1.PartNum=p.PartNum ORDER BY s1.Location ASC LIMIT 1); 

가 검색 순서로 상단에 올 것이다.

+0

위의 내 코멘트보기 –

0
SELECT p.Location,p.PartNum,p.Descrip,s.Status FROM Parts p 
LEFT outer JOIN Status s ON s.PartNum=p.PartNum 
where 
s.Location = (SELECT MAX(Location) FROM Status s1 
WHERE s1.PartNum=p.PartNum AND s1.Location 
IN('*Default*',p.Location)) 
+0

위의 내 코멘트보기 –

0

대체 기본값을 사용하는 것처럼 보입니다. 당신은 테이블에 합류 두 번 대신 하위 쿼리를 사용하여 같은 것을 시도 할 수 :

SELECT p.Location,p.PartNum,p.Descrip,s.Status 
FROM Parts p 
LEFT JOIN Status s1 ON s1.PartNum=p.PartNum AND p.Location = s1.Location 
LEFT JOIN Status s ON p.PartNum = s.PartNum 
    AND s.Location = IFNULL(s1.Location, '*Default*'); 

기본적으로 s1는 기본이 아닌 정보를 나타냅니다. s1.LocationNULL인지 여부를 확인하여 이러한 행이 있는지 확인하고 그렇지 않은 경우 *Default*으로 폴백 할 수 있습니다.

희망 하시겠습니까?

+0

위의 내 코멘트보기 –

+0

키와 인덱스는 무엇이 될지 궁금합니다. 'EXPLAIN' (http://dev.mysql.com/doc/refman/5.0/en/explain.html 참조)을 사용하여 쿼리에 대한 정보를 확인할 수 있습니다. 개인적으로 가능한 경우 하위 쿼리를 사용하지 않습니다. 하위 쿼리를위한 임시 저장소를 생성하면 특히 더 큰 결과 집합에 대해서는 실행 속도가 느려집니다. – sgcharlie