2010-05-04 5 views
1

J'ai un tableau avec la liste des codes de cycle.CYCLE_DEFINITION. chaque cycle_code a 12 mois d'entrées dans une autre table (PM1_CYCLE_STATE). Chaque mois a un cycle_start_date et un cycle_close_date. Je vais vérifier avec une date particulière (disons sysdate) et vérifier quel est le mois en cours de chaque cycle.additionally je vais aussi obtenir la liste des futurs 3 mois de ce cycle particulier.SQL requête - besoin de quelques suggestions

la requête que j'ai écrit est comme ci-dessous:

SELECT cycd,cm,sd,ed,ld FROM (SELECT pcs.cycle_code CYCD,LTRIM(pcs.cycle_month,'0')+0 CM, pcs.cycle_start_date SD,pcs.cycle_close_date ED,ld.logical_date LD FROM pm1_cycle_state pcs,logical_date ld WHERE 
ld.logical_date BETWEEN pcs.cycle_start_date AND pcs.cycle_close_date and ld.logical_date_type='B') 
UNION 
SELECT cycd,cm,sd,ed,ld FROM (SELECT pcs.cycle_code CYCD,DECODE(LTRIM(pcs.cycle_month,'0')+1,13,1,14,2,15,3,LTRIM(pcs.cycle_month,'0')+1) CM ,pcs.cycle_start_date SD,pcs.cycle_close_date ED,ld.logical_date LD FROM pm1_cycle_state pcs,logical_date ld WHERE 
ld.logical_date BETWEEN pcs.cycle_start_date AND pcs.cycle_close_date and ld.logical_date_type='B') 
UNION 
SELECT cycd,cm,sd,ed,ld FROM (SELECT pcs.cycle_code CYCD,DECODE(LTRIM(pcs.cycle_month,'0')+2,13,1,14,2,15,3,LTRIM(pcs.cycle_month,'0')+2) CM ,pcs.cycle_start_date SD,pcs.cycle_close_date ED,ld.logical_date LD FROM pm1_cycle_state pcs,logical_date ld WHERE 
ld.logical_date BETWEEN pcs.cycle_start_date AND pcs.cycle_close_date and ld.logical_date_type='B') 
UNION 
SELECT cycd,cm,sd,ed,ld FROM (SELECT pcs.cycle_code CYCD,DECODE(LTRIM(pcs.cycle_month,'0')+3,13,1,14,2,15,3,LTRIM(pcs.cycle_month,'0')+3) CM ,pcs.cycle_start_date SD,pcs.cycle_close_date ED,ld.logical_date LD FROM pm1_cycle_state pcs,logical_date ld WHERE 
ld.logical_date BETWEEN pcs.cycle_start_date AND pcs.cycle_close_date and ld.logical_date_type='B') 

Cette requête est en cours d'exécution parfaitement bien. Cela se traduira par tous les cycles_codes avec exactement 4 lignes pour le mois en cours et les 3 prochains mois.

Maintenant, l'exigence est de savoir s'il manque un mois. Comment pourrais-je le montrer? pour exemple: la sortie de la requête ci-dessus est

cycd cm 
102 1 
102 10 
102 11 
102 12 
103 1 
103 10 
103 11 
103 12 
104 1 
104 10 
104 11 
104 12 

Maintenant, supposons que la ligne avec cycd = 104 et cm = 11 ne figure pas dans le tableau, la requête ci-dessus ne sera pas obtenir la ligne 104 11. Je souhaite afficher uniquement ces lignes. comment pourrais-je le faire?

+0

Vous auriez besoin d'une jointure gauche gauche http://dev.mysql.com/doc/refman/5.0/en/join.html – Konerak

Répondre

0

J'obtenu une meilleure approche par beaucoup de réflexion. si j'ai une liste comme ceci:

102 1 
102 10 
102 11 
102 12 
103 1 
103 10 
103 11 
103 12 

alors je peux également obtenir la liste des entrées existantes dans le tableau comme ci-dessous (permet de dire 103 11 n'est pas présent dans le tableau) .Maintenant ma sortie de la requête serait comme ci-dessous

102 1 
102 10 
102 11 
102 12 
103 1 
103 10 
103 12 

depuis que j'ai les deux listes ci-dessus, je peux faire tout simplement un moins des deux requêtes et obtenir la puissance requise, conformément à la question que j'asked.And je l'ai fait le same.and i obtenu le sortie attendue.S'il vous plaît mettre quelques commentaires si vous voulez voir la requête!

0

Créer une table contenant mois 1 à 12, cross rejoindre mois avec pm1_cycle_state, et à gauche se joignent à votre instruction select (probablement en vue):

SELECT pm1_cycle_state.cycle_code, months.month 
FROM pm1_cycle_state 
CROSS JOIN months 
LEFT OUTER JOIN V_Cycle_Months 
    ON V_Cycle_Months.cycd = pm1_cycle_state.cycle_code 
    AND V_Cycle_Months.cm = months.month 
WHERE V_Cycle_Months.cycd IS NULL 
+0

Cette requête ne me donne pas la sortie requise. si 104 a l'entrée '104 11' manquante je veux seulement' 104 11' mais cette requête donne tous les mois y compris 11, par exemple: sa donner moi et la sortie des mois de cycle 2 3 4 5 6 7 8 9 11 .mais Je veux seulement 11 – Vijay

+0

@bb, alors soit mettre seulement les mois intéressants dans la table des mois ou au lieu de pm1_cycle_state mois CROSS JOIN utiliser (votre requête syndicale ici) – Unreason

Questions connexes