2010-08-10 8 views
2

Je rencontre des difficultés avec une requête qui affiche les enregistrements en fonction de leur taux de remplissage. Par exemple, une offre d'emploi ne peut contenir aucune réservation ou réservation. Si une offre d'emploi a des réservations, elles peuvent prendre la forme «active [1]», «pending [0]». La requête que j'ai écrite jusqu'ici fonctionne si la vacance a des enregistrements de réservation, mais je ne peux pas le faire fonctionner si elle n'a pas de dossiers de réservation.Interrogation sur la valeur de comptage ayant()

Ma requête (qui fonctionne) pour les postes avec une réservation est le suivant: -

SELECT v.*, j.job_category_name, bu.business_unit_name 
FROM vacancy v 
INNER JOIN job_category j ON j.job_category_id = v.job_category_id 
INNER JOIN business_unit bu ON bu.business_unit_id = v.business_unit_id 
INNER JOIN booking b ON b.vacancy_id = v.vacancy_id 
INNER JOIN booking_status bs ON bs.id = b.booking_status_id 
WHERE 
    v.vacancy_status <> 'revoked' AND 
    v.vacancy_reference <> 'auto-generated booking' AND 
    v.business_unit_id IN (series of primary keys) AND 
(bs.booking_status_type_id = 1 OR bs.booking_status_type_id = 2) 
GROUP BY v.vacancy_id 
HAVING v.vacancy_limit > count(b.booking_id) 
ORDER BY v.vacancy_id DESC 

Je pensais en changeant la jonction de b et bs à LEFT JOIN aurait travaillé, mais il n'a pas.

Des idées?

Répondre

0

Sans une copie de votre schéma pour travailler à partir, il est difficile de dire exactement, mais quand vous changé booking et bookingstatus à LEFT JOIN s, vous avez également modifier votre article WHERE afin qu'il lisait quelque chose comme:

WHERE 
    v.vacancy_status <> 'revoked' AND 
    v.vacancy_reference <> 'auto-generated booking' AND 
    v.business_unit_id IN (series of primary keys) AND 
    (ISNULL(bs.booking_status_type_id, 1) = 1 OR ISNULL(bs.booking_status_type_id, 2) = 2) 

ie Vérifié que la clause WHERE complète serait satisfaite, ne supprimant donc pas les enregistrements où toutes les valeurs des colonnes booking et bookingstatus étaient NULL?

+0

Je suis juste en train d'essayer d'utiliser les options ISNULL, merci. –

+1

@ user275074, notez que si le champ 'booking_status_type_id' est toujours NULL dans vos données réelles, la requête ne se comportera pas comme prévu car elle traitera ces lignes comme si elles avaient un« booking_status_type_id »de 1 ou 2 , donc vous voudrez probablement modifier légèrement votre requête plutôt que d'utiliser exactement celle que j'ai écrite ci-dessus, si cela fonctionne pour vous =) – Rob

+0

booking_status_type_id ne sera jamais nul, il ne sera plus jamais 1,2,3 ou 4 –

0

Essayez LEFT OUTER JOIN pour les tables pour lesquelles les jointures peuvent renvoyer 0 correspondances. Par exemple: - dans votre cas, avoir LEFT OUTER JOIN pour b et bs et vérifier

+0

Si j'utilise LEFT OUTER JOIN avec une combinaison de (ISNULL (bs.booking_status_type_id) = 1 OU ISNULL (bs.booking_status_type_id) = 2) pour les postes non pourvus la requête travaux. Pour le faire fonctionner lors de l'interrogation pour les postes vacants remplis, je dois conserver le LEFT OUTER JOIN et utiliser (bs.booking_status_type_id = 1 OU bs.booking_status_type_id = 2) à la place. –

+0

Quelle est la raison pour laquelle cette requête fonctionnera avec la jointure externe gauche mais pas avec la jointure gauche? –

+0

En fait, l'utilisation de LEFT JOIN fonctionne dans les deux cas. –

Questions connexes