2015-03-18 63 views
0

车辆outputed记录数如何显示从一个表中的记录,其中依赖于另一个表

 +--------+--------+-----------+ 
    | regNo | make | model | 
    +------- +--------+-----------+ 
    | SM56ED | BMW | 3 Series | 
    +--------+--------+-----------+ 
    | GH45EM | Audi | A3  | 
    +--------+--------+-----------+ 
    | LM33ZG | Toyota | Yaris | 
    +--------+--------+-----------+ 
    | ZR88HH | Suzuki | Swift | 
    +--------+--------+-----------+ 

预订

 +----+---------+------------+------------+ 
    | id | regNo | date_from | date_to | 
    +----+---------+------------+------------+ 
    | 1 | SM56ED | 2015-03-20 | 2015-04-10 | 
    +----+---------+------------+------------+ 
    | 2 | LM33ZG | 2015-05-15 | 2015-05-22 | 
    +----+---------+------------+------------+ 

所以可以说我有这两个表。我要检查对其他两个日期,让说:

from: '2015-03-25' 
    to: '2015-04-05' 

我想显示每一个汽车制造商,型号不具有预订或预订指定日期之间不落。所以对于上面的例子,它应该显示奥迪,丰田和铃木,但不是宝马,因为在该车辆的指定日期之间有预订。

我试图使用'WHERE NOT EXISTS',内部检查是否在date'BETWEEN''date_from'和'date_to'中传递。然而,如果没有车辆预订,这将返回所有车辆,或者如果在日期之间预订了至少一辆车辆,则返回0车辆。

任何意见表示赞赏,谢谢。

回答

0

你必须在not exists部分查询涉及到外部查询(例如。作出相关查询):

select * from Vehicle v 
where not exists (
    select 1 from Booking 
    where regNo = v.regNo 
     and date_from <= '2015-04-05' 
     and date_to >= '2015-03-25' 
    ) 

建立在exists谓词的查询往往是最快的解决方案。

+0

我有一个非常类似的解决方案(可惜已经删除了),并没有奏效,但是这个效果很好。谢谢。 – Marius 2015-03-18 21:50:53

+0

@Marius高兴地帮助:) – jpw 2015-03-18 21:52:15

0

我没有一个分贝测试了这一点在ATM上,但如何对一个连接,像这样:

select * from Vehicle v left join Booking b on v.regNo = b.regNo where b.id is null or (b.date_from > '2015-03-25' and b.date_to < '2015-04-05') 
+0

由于查询中存在错误,这也将排除丰田。 – jpw 2015-03-18 21:46:55

+0

@Marius,当然。正常加入会排除任何没有匹配预订的车辆,但左侧加入意味着包括左侧(车辆)上的所有记录,而不管右侧是否有记录(预订)。如果有帮助,请随时接受答案。 :) – Noah 2015-03-18 21:50:15

+0

@sqrfv但查询不会返回所需的结果? – jpw 2015-03-18 21:51:37

相关问题