2015-05-06 92 views
1

选择查询我有一个问题,选择查询包括一个链接表

我需要select coid,model,km,year所有具有ACMP3车辆。

我写这个SQL:

select distinct 
    vehicle.vehid, model, km, year 
from 
    vehicle, models, extras, veh_extras 
where 
    models.modid = vehicle.modid 
    and vehicle.vehid = veh_extras.vehid 
    and extras.extraid = veh_extras.extraid 
    and (descr = 'AC' or descr = 'mp3') 

,但我认为这是错误的。 Extras.desc是附加说明的列。

schema link

+0

什么是coid?该列不在您发布的表格中。你也可以看看这篇文章,并考虑使用ANSI-92风格的连接。它们更清洁,不易出错。 http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx –

+1

但是你需要两个额外(AND)或者至少一个(OR)? – Javaluca

+0

[踢坏的习惯:使用旧式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins。 aspx) - 在ANSI - ** 92 ** SQL标准(**超过20年前**)中,旧式*逗号分隔的表*样式列表被替换为* proper * ANSI'JOIN'语法它的使用是不鼓励的 –

回答

4
SELECT v.vehid, m.model, v.km, v.year 
FROM vehicle v 
JOIN model m ON v.modid = m.modid 
WHERE EXISTS ( SELECT 'a' 
       FROM extras e 
       JOIN veh_extras ve ON e.id = ve.extraid 
       WHERE ve.vehid = v.vehid 
       AND e.descr = 'AC' 
      ) 
AND EXISTS ( SELECT 'a' 
       FROM extras e 
       JOIN veh_extras ve ON e.id = ve.extraid 
       WHERE ve.vehid = v.vehid 
       AND e.descr = 'mp3' 
      ) 

这可能不是最好的办法......但如果你需要寻找更多的群众演员只是增加一个EXISTS条件

+0

这将找到AC或MP3的行。这不是OP所期望的,因为他们只想要那些有两种选择的人。 –

+0

从他的问题不清楚,,我在评论区要求它,但他还没有回答 – Javaluca

+0

我想同时配对 – user3135218

1

但我认为它错了。

即使它工作,那么它也不是推荐的方法。

尽量避免用逗号分隔连接。相反,尝试使用JOINS这样的:

select distinct v.vehid,model,km,year 
    from vehicle v inner join models m on v.modid = m.modid 
       inner join veh_extras ve on ve.vehid = v.vehid 
       inner join extras e on e.extraid = ve.extraid   
     where 
      e.descr='AC' or e.descr='mp3' 
+2

Downvoter care to comment! –

+2

不知道为什么这会被低估。我会建议使用别名,但除此之外,这是FAR比旧式连接更好。 –

+1

不知道为什么它downvoted,而且'vehicle.vehid = models.modid'需要'vehicle.modid = models.modid' – SQLChao

3

假设你要车同时具有交流和MP3,然后一个办法是加入到veh_extras表多次:

select distinct v.vehid, m.model 
from vehicle v 
    join models m on m.modid = v.modid 
    join veh_extras ve on v.vehid = ve.vehid 
    join extras e on ve.extraid = e.extraid and e.descr = 'AC' 
    join veh_extras ve2 on v.vehid = ve2.vehid 
    join extras e2 on ve2.extraid = e2.extraid and e2.descr = 'MP3' 

另一种选择是使用情况汇总:

select v.vehid, m.model 
from vehicle v 
    join models m on m.modid = v.modid 
    join veh_extras ve on v.vehid = ve.vehid 
    join extras e on ve.extraid = e.extraid 
group by v.vehid, m.model 
having sum(case when e.descr = 'AC' then 1 else 0 end) > 0 
    and sum(case when e.descr = 'MP3' then 1 else 0 end) > 0 

顺便说一句 - 我留下了一些补救列 - 易把那些加回去...

+0

总结例子非常好,谢谢。 – user3135218