2012-11-26 189 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为空的行。

+0

还有另外一个'Vehicle AS V'条款,你没有'修复',但我认为这不会对结果产生影响。 –