2017-10-17 2 views
3

J'ai donc joint quelques tables et j'ai quelques problèmes. Voici mon sql:Sql Rechercher des enregistrements distincts dans les tables jointes internes

SELECT co.orderid, 
     orderdate, 
     emailaddr, 
     city, 
     weight, 
     partdescription 
FROM customer c 
INNER JOIN custorder co ON c.customerid = co.customerid 
INNER JOIN custorderline cl ON co.orderid = cl.orderid 
INNER JOIN inventorypart i ON cl.partnumber = i.partnumber 
WHERE orderdate BETWEEN to_date('2015/11/01', 'yyyy/mm/dd') AND to_date('2015/11/30', 'yyyy/mm/dd') 
    AND emailaddr LIKE '%gmail%' 
    OR emailaddr LIKE '%outlook%' 
    AND categoryid IS NOT NULL 
    AND weight > 30; 

voici quelques résultats:

ORDERID ORDERDATE EMAILADDR           CITY      WEIGHT PARTDESCRIPTION         
---------- --------- -------------------------------------------------- -------------------- ---------- -------------------------------------------------- 
2000000351 30-NOV-15 [email protected]         Walla Walla     .5 MINI TOWER CASE         
2000000351 30-NOV-15 [email protected]         Walla Walla    34.44 EAGLE Z240 XEON E3         
2000000354 01-DEC-15 [email protected]        Miami      34.44 EAGLE Z240 XEON E3         
2000000224 07-OCT-15 [email protected]        Asheville     34.44 EAGLE Z240 XEON E3         
2000000279 01-NOV-15 [email protected]        Sumter      .438 BOARD GAMES          
2000000279 01-NOV-15 [email protected]        Sumter      .375 INTERNET SECURITY         
2000000298 08-NOV-15 [email protected]         Ogden      27.32 EAGLE PRETIEGE 9000        
2000000311 12-NOV-15 [email protected]         Whales      .5 2GB RADEON R7 350 VIDEO CARD      
2000000316 16-NOV-15 [email protected]         Charleston     .375 FLASH WING OPTICAL GAMING MOUSE     
2000000320 17-NOV-15 [email protected]         Burns      .188 HDMI MALE 180 DEG SWIVEL       
2000000346 29-NOV-15 [email protected]     

ici est ce que je suis en train d'accomplir. toutes les commandes en novembre, les e-mails contiennent gmail ou outlook, les numéros de pièces doivent avoir un identifiant de catégorie, les pièces doivent peser plus de 30 pièces, et la commande ne s'affiche qu'une seule fois. Mes problèmes sont que les pièces pesant moins de 30 apparaissent toujours et je dois d'une certaine façon faire en sorte que "si une commande apparaît plus d'une fois, la liste seulement une fois."

Ceci est une question que je suis perplexe sur ... J'ai joué avec elle depuis longtemps maintenant, continue de revenir à elle et pense que je pense juste à tort. Toute aide ou avis serait apprécié!

+0

Pourquoi le même numéro de commande apparaissent avec la ville et différents poids? Quelle rangée est correcte? – kbball

Répondre

0

Vous devez ajouter des crochets à votre clause WHERE pour traiter correctement la logique "OU".

select co.orderid, orderdate, emailaddr, city, weight, partdescription 
    from customer c 
inner join custorder co on c.customerid = co.customerid 
inner join custorderline cl on co.orderid = cl.orderid 
inner join inventorypart i on cl.partnumber = i.partnumber 
where orderdate between to_date('2015/11/01', 'yyyy/mm/dd') 
    and to_date('2015/11/30', 'yyyy/mm/dd') 
    and (emailaddr like '%gmail%' or emailaddr like '%outlook%') 
    and categoryid is not null 
    and weight > 30; 

De plus, cette requête ne sera pas obtenir des commandes plus tard « 30/11/2015 00:00 », par exemple, il ne sera pas attraper « 30/11/2015 00:01 ». Vous avez donc besoin d'ajouter temps au masque de format:

...AND to_date('2015/11/30 23:59:59', 'yyyy/mm/dd hh24:mi:ss') 

ou au lieu de l'utilisation ENTRE

orderdate >= to_date('2015/11/01', 'yyyy/mm/dd') 
and orderdate < to_date('2015/12/01', 'yyyy/mm/dd')