2011-09-13 3 views
0

Je travaille sur un projet où j'essaie de combiner trois tables différentes. Les tables 1 et 2 ont une ligne avec le même ID, qui dans ce cas est le product_id, et il en va de même pour les tables 2 et 3. J'utilise la date comme condition lorsque j'envoie la requête, où je ' Je suis seulement censé obtenir les résultats qui correspondent à l'image donnée. Voici mon code:Question liée à la date et joindre

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' ; 

Lorsque j'utilise ceci, je reçois seulement une date, contenue dans la table de commande. Je reçois également des informations à partir de lignes qui ne correspondent pas à la date donnée.

Je suis vraiment désolé si ce n'est que confus. Mon anglais n'est pas très bon, donc j'ai du mal à le comprendre. Aussi, s'il vous plaît laissez-moi savoir si vous avez besoin de plus d'informations. Nouveau sur ce site et SQL.

+0

Ne devrait pas être 'entre date' 2009-09-01 'et date' 2009-09-30''? –

+0

@Joel Non, ça ne devrait pas. –

+0

@Adrian, c'est ce qui se passe quand on s'habitue à PL/SQL. –

Répondre

6

Essayez de rejoindre les trois tables:

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

Ça pourrait être ça. Malheureusement, je ne peux pas le tester maintenant car je n'ai accès qu'à mon université. Mais va l'essayer à la première heure le matin! Merci pour les réponses rapides! – Cor

+1

Votre problème est vous implicite mélangé et explicite la syntaxe et la syntaxe implicite est une jointure croisée. Il n'y a aucune circonstance où la syntaxe implicite devrait être utilisée. N'écrivez jamais de code en l'utilisant à nouveau car c'est un très mauvais antipattern SQI. Les jointures accidentelles comme celle-ci font partie des raisons pour lesquelles il est extrêmement difficile d'utiliser ces techniques de programmation qui ont été remplacées il y a 20 ans avec une meilleure technique. – HLGEM

+0

Et ça a marché! Merci beaucoup! – Cor

0

Bien que je pense que le manque clause de jointure (selon la réponse de @ p.campbell) résoudra votre « trop de lignes retournées » problème, je me demande si si il y a un autre problème "pas assez de lignes retournées" avec votre représentation de la date par exemple

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

L'intention est sans doute de revenir commandes pour Septembre 2009, mais omettrait celui où orderDate = '2009-09-01 12:00:00'.

Votre code implique que vous utilisez ce que la littérature appelle la représentation fermée des périodes, où la date de fin est incluse dans la période. Toutefois, la recommandation est d'utiliser une représentation fermée-ouverte (également appelée demi-intervalle) où la date de fin n'est pas incluse dans la période.

Ainsi, en utilisant la représentation fermée ouverte, le même prédicat (à savoir tous les ordres Septembre 2009) serait:

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

Pour plus de détails, voir Snodgrass, Richard T. (1999). Developing Time-Oriented Database Applications in SQL, chapitre 4 périodes.