从多个表中排除记录的最佳方法

时间:2011-10-26 15:24:08

标签: oracle oracle11g

我有下表(只是一个例子):vehicles,vehicle_descriptions,vehicle_parts

车辆有1到多个车辆描述和vehicle_parts。对于给定的车辆,可能没有相应的vehicle_description / part。

SELECT * FROM vehicles
   LEFT OUTER JOIN vehicles d ON vehicles.vin = d.vin AND d.summary NOT LIKE 'honda'
   LEFT OUTER JOIN        
   (SELECT SUM(desc_total) FROM vehicle_descriptions WHERE NOT LIKE desc 'honda' GROUP BY vin) b 
   ON vehicles.vin = vehicle_b.vin
   LEFT OUTER JOIN 
   (SELECT SUM(part_count) FROM vehicle_parts WHERE part_for NOT LIKE 'honda' GROUP BY vin) c ON vehicles.vin = c.vin

如果vehicle_desc,vehicle或part包含排除项,则整个记录不应显示在结果集中。即使其中一个表包含排除术语Honda,上面的查询也会返回一条记录。我该如何解决上述问题?

1 个答案:

答案 0 :(得分:2)

您没有使用sum()中的任何信息作为您所展示的内容的一部分,只是为了决定是否包含该车辆。你在第一个条款中做了不必要的自我加入。通常在这种情况下,“存在”和“不存在”子句运行良好。那么这个怎么样?我将使用Oracle语法,当然可以转换为ANSI。

    SELECT * FROM vehicles v where summary <> 'honda' 
and not exists (select 1 from vehicle_descriptions d where d.vin = v.vin and d.desc <> 'honda') 
and not exists (select 1 from vehicle_parts p where p.vin = v.vin and p.part_for <> 'honda')