Вопрос, связанный с датой и присоединением - PullRequest
0 голосов
/ 13 сентября 2011

Я работаю над проектом, в котором я пытаюсь объединить три разных таблицы. Таблицы 1 и 2 получили строку с одинаковым идентификатором, который в данном случае является 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 ]

6 голосов
/ 13 сентября 2011

Попробуйте объединить все три таблицы:

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' ;
0 голосов
/ 14 сентября 2011

Хотя я думаю, что отсутствующее предложение join (согласно ответу @ p.campbell) решит вашу проблему «слишком много строк возвращено», мне интересно, есть ли еще одна проблема «недостаточно строк возвращено» с вашей датойнапример, представление

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

Предполагается, что предполагается вернуть заказы за сентябрь 2009 года, но будет пропущено одно, где orderDate = '2009-09-01 12:00:00'.

Ваш код подразумевает, что вы используете то, что в литературе называется закрытым представлением периодов, когда дата окончания включена в период.Тем не менее, рекомендуется использовать закрытое открытое представление (также называемое полуоткрытыми интервалами), где конечная дата не включена в период.

Таким образом, используя закрытое открытое представление, тот же предикат (т. Е. Все заказы в сентябре 2009 года) будет:

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

Подробнее см. Snodgrass, Richard T. (1999).Разработка ориентированных на время приложений баз данных в SQL , глава 4 Периоды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...