我正在开展一个项目,我正在尝试将三个不同的表组合在一起。 表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都是新的。
答案 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章期间。