与日期和加入有关的问题

时间:2011-09-13 18:32:47

标签: mysql sql

我正在开展一个项目,我正在尝试将三个不同的表组合在一起。 表1和2得到一行具有相同的ID,在这种情况下是product_id,表2和3也是如此。我在发送查询时使用日期作为条件,我在哪里只应该得到适合给定帧内的结果。这是我的代码:

select order.orderDate, orderLine.order_id, product.product_id, product.name
from order, product
inner join orderLine
on product.product_id = orderLine.product_id
where order.orderDate between  '2009-09-01' and '2009-09-30' ;

当我使用它时,我只得到一个日期,包含在订单表中。我也从不符合给定日期的行中获取信息。

如果这只是令人困惑,我很抱歉。我的英语不是很好,所以很难让这个变得可以理解。另外,如果您需要更多信息,请告诉我。这个站点和SQL都是新的。

2 个答案:

答案 0 :(得分:6)

尝试加入所有三个表:

select o.orderDate, ol.order_id, p.product_id, p.name
from order as o 
inner join orderLine as ol
   on ol.order_id = o.order_id
inner join  product as p on o
   on p.product_id = ol.product_id
where o.orderDate between  '2009-09-01' and '2009-09-30' ;

答案 1 :(得分:0)

虽然我认为缺少的连接子句(根据@ p.campbell的答案)将解决你的“返回的行太多”问题,但我想知道你的日期是否还有一个“没有足够的行返回”问题表示例如

where order.orderDate between '2009-09-01' and '2009-09-30'

意图可能是返回2009年9月的订单,但会省略orderDate = '2009-09-01 12:00:00'的订单。

您的代码暗示您正在使用文献中称为句号的闭合表示形式,其中结束日期包含在句号中。但是,建议使用封闭开放表示(也称为半开放间隔),其中结束日期不包括在期间内。

因此,使用闭合开放表示,相同的谓词(即2009年9月的所有订单)将是:

where order.orderDate >= '2009-09-01' 
      and order.orderDate < '2009-10-01'

有关详细信息,请参阅Snodgrass, Richard T. (1999). Developing Time-Oriented Database Applications in SQL,第4章期间。