2010-02-13 3 views
1

Laquelle des requêtes suivantes sont correctesclause IN sur plusieurs colonnes à l'aide et, joignez-vous

SELECT 
ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME 
WHERE 
STATUS IN('OPEN','UPDATED') 
AND 
ITEM_TYPE IN ('ITEM1','ITEM2') 
AND 
CREATED_TIME BETWEEN 'XX' AND 'YY' 
AND 
UPDATED_TIME BETWEEN 'XX' AND 'ZZ' 

SELECT 
     ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME 
WHERE 
     STATUS IN('OPEN','UPDATED') 
JOIN 

SELECT 
     ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME 
WHERE 
     ITEM_TYPE IN ('ITEM1','ITEM2') 
JOIN 

SELECT 
     ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME 
WHERE 
     CREATED_TIME BETWEEN 'XX' AND 'YY' 
JOIN 

SELECT 
     ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME 
WHERE 
     UPDATED_TIME BETWEEN 'XX' AND 'ZZ' 

Répondre

0

La première est correcte, sauf si vous voulez une explosion exponentielle de Autojointures.

+0

ce que j'entendu si UNION renvoie des lignes distinctes et retourne UNIONALL exponentielle explosin, s'il vous plaît corrigez-moi si je me trompe – Subbu

+0

Vous n'êtes pas en train de faire UNION, vous faites un JOIN. –

+0

Je suis désolé de la deuxième QUERY, donc si j'utilise l'union que je devrais obtenir les résultats attendus SELECT ID, STATUS, ITEM_TYPE, CREATED_TIME, UPDATED_TIME OÙ STATUT ('Open', 'MISE À JOUR') UNION SELECT ID, STATUS, ITEM_TYPE, CREATED_TIME, UPDATED_TIME OÙ ITEM_TYPE IN ('ITEM1', 'ITEM2') UNION SELECT ID, STATUS, ITEM_TYPE, CREATED_TIME, UPDATED_TIME OÙ CREATED_TIME ENTRE 'XX' 'YY' UNION SELECT ID, STATUS, ITEM_TYPE, CREATED_TIME, UPDATED_TIME OÙ UPDATED_TIME ENTRE 'XX' ET 'ZZ' – Subbu

0

La première requête est correcte, la seconde donnerait, bien .... un LOT de reuslts.

En réponse à votre commentaire, comme SQLMenace a souligné, l'utilisation ou à la place si vous voulez faire correspondre tout des conditions:

SELECT ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME 
WHERE STATUS IN('OPEN','UPDATED') 
    OR ITEM_TYPE IN ('ITEM1','ITEM2') 
    OR CREATED_TIME BETWEEN 'XX' AND 'YY' 
    OR UPDATED_TIME BETWEEN 'XX' AND 'ZZ' 

Ou, si vous vouliez toujours restreindre le temps , mais rencontrer soit des conditions premières, puis utilisez un OU enveloppé:

SELECT ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME 
WHERE (STATUS IN('OPEN','UPDATED') OR ITEM_TYPE IN ('ITEM1','ITEM2')) 
    AND CREATED_TIME BETWEEN 'XX' AND 'YY' 
    AND UPDATED_TIME BETWEEN 'XX' AND 'ZZ' 
+0

Merci pour la réponse, mais le problème que je rencontre est que si une condition échoue, la requête ne renvoie aucune valeur. par exemple s'il n'y a pas de lignes correspondantes pour update_time aucune ligne n'est retournée même si toutes les autres conditions correspondent – Subbu

+1

Dans ce cas, utilisez OU non ET – SQLMenace

0

le premier

REJOINT doivent être avant la clause WHERE

bien que vous pouvez réécrire l'REJOINT avec EXISTE puis vous coupez le mettre dans la clause WHERE

+0

pouvez-vous s'il vous plaît fournir un exemple – Subbu

Questions connexes