如何显示一个表中的记录,其中输出记录的数量取决于另一个表

Posted

技术标签:

【中文标题】如何显示一个表中的记录,其中输出记录的数量取决于另一个表【英文标题】:How can i display records from one table where the number of outputed records depend on another table 【发布时间】:2015-03-18 21:30:29 【问题描述】:

车辆

     +--------+--------+-----------+
     | 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”,检查传入的日期是否落在“BETWEEN”、“date_from”和“date_to”。但是,如果没有车辆被预订,这将返回所有车辆,或者如果在日期之间至少预订一辆车,则返回 0 车辆。

感谢任何建议,谢谢。

【问题讨论】:

【参考方案1】:

您必须将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 谓词构建的查询通常是最快的解决方案。

【讨论】:

我有一个非常相似的解决方案(很遗憾已经删除了它),但它没有用,但是它非常有效。谢谢。 @Marius 乐于助人:)【参考方案2】:

我没有数据库可以在 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')

【讨论】:

这也将排除丰田,因为查询中有错误。 @Marius,当然。正常联接将排除没有匹配预订的任何车辆,但“左”联接意味着包括左侧(车辆)上的所有记录,无论是否在右侧(预订)找到记录。如果有帮助,请随时接受答案。 :) @sqrfv 但是查询不会返回想要的结果? @jpw,啊,是的,我把日期翻了。这就是我没有在数据库中测试的结果。

以上是关于如何显示一个表中的记录,其中输出记录的数量取决于另一个表的主要内容,如果未能解决你的问题,请参考以下文章

如何显示条件来自另一个表的一个表中的记录?

如何比较 Oracle 中的记录集或记录组?

如何显示多个表中的父记录和子记录

创建一个表,其中只包含一个表中存在的记录而不存在另一个表中的记录

如何根据另一个表中的值创建重复记录

如何通过将一个表中的 id 与另一个表匹配来选择和更新一个表中的记录?