2010-08-10 3 views
2

У меня возникли трудности с запросом, который отображает записи в соответствии с их скоростью заполнения.Запрос на значение count having()

Например, вакансия не имеет заказов или некоторых заказов. Если вакансия имеет заказы, они могут быть в форме «активных [1]», «ожидающих [0]». Запрос, который я написал до сих пор, работает, если вакансия имеет записи о бронировании, но я не могу заставить ее работать, если у нее нет записей о бронировании.

Мой запрос (который работает) на вакантные с бронированием выглядит следующим образом: -

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 

Я думал, изменив джойн б и шс к LEFT JOIN работала бы, но это не имеет.

Любые идеи?

ответ

0

Без копии вашей схемы для работы с, это трудно сказать точно, но когда вы изменили booking и bookingstatus к LEFT JOIN с, вы также измените положение WHERE так, чтобы он читал что-то вроде:

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 Убедитесь, что полное предложение WHERE будет удовлетворено, таким образом, не удаляя записи, где все значения столбцов от и bookingstatus были NULL?

+0

Я просто пытаюсь использовать опции ISNULL, спасибо. – 2010-08-10 09:08:26

+1

@ user275074, обратите внимание, что если поле 'booking_status_type_id' всегда имеет значение NULL в ваших фактических данных, запрос не будет вести себя так, как вы ожидали бы, поскольку он будет обрабатывать эти строки, как если бы у них было' booking_status_type_id' 1 или 2 , так что вы, вероятно, захотите немного подправить свой запрос, а не просто использовать то, что я написал выше, если оно работает для вас =) – Rob

+0

booking_status_type_id никогда не будет равным нулю, это будет только когда-либо 1,2,3 или 4 – 2010-08-10 09:15:46

0

Попробуйте LEFT OUTER JOIN для таблиц, для которых соединения могут возвращать 0 совпадений. Например: - в вашем случае LEFT OUTER JOIN для b и bs и check

+0

Если я использую LEFT OUTER JOIN с комбинацией (ISNULL (bs.booking_status_type_id) = 1 ИЛИ ISNULL (bs.booking_status_type_id) = 2) для незаполненных вакансий запрос работает. Чтобы заставить его функционировать при запросе заполненных вакансий, мне нужно сохранить LEFT OUTER JOIN и использовать (bs.booking_status_type_id = 1 ИЛИ bs.booking_status_type_id = 2). – 2010-08-10 09:17:05

+0

В чем причина того, что этот запрос будет работать с левым внешним соединением, но не с левым соединением? – 2010-08-10 09:26:00

+0

Фактически, использование LEFT JOIN работает в обоих случаях. – 2010-08-10 09:28:55