2015-05-06 120 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