2012-11-26 4 views
0

나는이 두 개의 쿼리를 결합하려고합니다.SQL - 두 개의 쿼리 결합하기

쿼리 1 - 이것은 내가 가지고있는 모든 차량이 내 인벤토리에 있음을 알려줍니다. 의미가 소유권 표에 없습니다.

SELECT VEHICLE.* 
FROM VEHICLE 
WHERE NOT EXISTS 
(SELECT NULL FROM OWNERSHIP WHERE VEHICLE.VEH_ID= OWNERSHIP.VEH_ID); 

쿼리 2 -이 것은 각 자동차에 대해 가장 높은 가격대의 자동차를 알려줍니다.

SELECT B.BRAND_ID, B.BRAND_NAME, M.MODEL_NAME, C.CLASS_NAME, V.VEH_ID, V.VEH_YEAR, V.VEH_PRICE 

FROM (((VEHICLE AS V INNER JOIN CLASS AS C ON V.CLASS_ID = C.CLASS_ID) 
INNER JOIN MODEL AS M ON M.MODEL_ID = V.MODEL_ID) 
INNER JOIN BRAND AS B ON B.BRAND_ID = M.BRAND_ID) 
INNER JOIN (SELECT M.BRAND_ID, MAX(V.VEH_PRICE) AS VEH_PRICE FROM VEHICLE AS V 
INNER JOIN MODEL AS M ON M.MODEL_ID = V.MODEL_ID GROUP BY M.BRAND_ID) 

AS derived ON (v.VEH_PRICE = derived.VEH_PRICE) AND (b.BRAND_ID = derived.BRAND_ID) 
ORDER BY 7 DESC; 

내가 가장 비싼 차량을 결정하는 것은 고객이 이미 소유하고 있다면 중요하지 않습니다. 첫 번째 쿼리는 어떤 것을 사용할 수 있는지 알려주므로이 두 가지를 어떻게 결합합니까?

답변

2

나는 당신의 쿼리를 테스트, 그러나 이것은 당신이 찾고있는 것을 생각하지 못했습니다 : 당신은 이미 각 브랜드에 대한 최대 가격을 계산하는 서브 쿼리에 소유 한 자동차를 제외 할 필요

SELECT 
    B.BRAND_ID, 
    B.BRAND_NAME, 
    M.MODEL_NAME, 
    C.CLASS_NAME, 
    V.VEH_ID, 
    V.VEH_YEAR, 
    V.VEH_PRICE 
FROM 
    (((VEHICLE AS V INNER JOIN CLASS AS C ON V.CLASS_ID = C.CLASS_ID) 
    INNER JOIN MODEL AS M ON M.MODEL_ID = V.MODEL_ID) 
    INNER JOIN BRAND AS B ON B.BRAND_ID = M.BRAND_ID) 
    INNER JOIN (SELECT M.BRAND_ID, MAX(V.VEH_PRICE) AS VEH_PRICE 
       FROM VEHICLE AS V 
        INNER JOIN MODEL AS M 
        ON M.MODEL_ID = V.MODEL_ID 
       WHERE 
       NOT EXISTS 
        (SELECT NULL FROM OWNERSHIP 
        WHERE V.VEH_ID=OWNERSHIP.VEH_ID) 
       GROUP BY M.BRAND_ID) AS derived 
    ON (v.VEH_PRICE = derived.VEH_PRICE) 
    AND (b.BRAND_ID = derived.BRAND_ID) 
WHERE 
    NOT EXISTS 
    (SELECT NULL FROM OWNERSHIP 
    WHERE V.VEH_ID=OWNERSHIP.VEH_ID) 
ORDER BY 7 DESC; 

하지만, 외부 쿼리에서 소유자가없는 자동차의 최대 가격과 동일한 가격의 소유 자동차를 제외 할 수도 있습니다.

NOT EXISTS 절을 사용하는 대신 하위 쿼리와 외부 쿼리 모두에서 OWNERSHIP이있는 LEFT JOIN을 하나 더 추가하고 OWNERSHIP.VEH_ID가 null 인 행만 가져 오는 것이 좋습니다.

+0

'Vehicle AS V' 조항이 있는데,'수정 '하지 않았지만 결과에 차이가 있다고 생각하지 않습니다. –

관련 문제