2010-08-10 4 views
2

채우기 속도에 따라 레코드를 표시하는 쿼리에 문제가 있습니다.()가 포함 된 카운트 값 쿼리

예를 들어 결원에는 예약이 없거나 일부 예약이있을 수 없습니다. 공석에 예약이있는 경우 '공석 [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 

내가이 일 것 가입 왼쪽으로 B와 학사의 가입 변경하여 생각했지만, 그것은 못한 - 다음과 같이 예약과 공석 (작동)

내 쿼리입니다.

아이디어가 있으십니까?

에서 작동하도록 스키마의 사본없이

답변

0

, 정확히 말해 어렵지만, 같은 것을 읽을 수 있도록 당신은 또한 당신의 WHERE 절을 수정 않았다 LEFT JOIN s로 bookingbookingstatus을 변경하는 경우 :

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) 

즉, 전체 WHERE 절이 충족되어, bookingbookingstatus의 모든 값이 NULL 인 레코드를 제거하지 않도록하십시오.

+0

ISNULL 옵션을 사용하고 있습니다. 감사합니다. –

+1

@ user275074,'booking_status_type_id' 필드가 실제 데이터에서 NULL이 아닌 경우'booking_status_type_id'가 1 또는 2 인 것처럼 해당 행을 처리하므로 예상 한대로 동작하지 않습니다 , 당신은 아마 당신이 위의 정확한 하나를 사용하는 것보다 쿼리를 미세 조정하고 싶을 것입니다. = – Rob

+0

booking_status_type_id는 결코 null이되지 않을 것입니다. 단지 1,2,3 또는 4 일 것입니다. –

0

조인에서 0 개를 반환 할 수있는 테이블에 대해 LEFT OUTER JOIN을 시도하십시오. 예를 들면 : - 귀하의 경우에 b 및 bs에 대해 LEFT OUTER JOIN이 있고

을 확인하십시오.
+0

채워지지 않은 공석에 대해 (ISNULL (bs.booking_status_type_id) = 1 또는 ISNULL (bs.booking_status_type_id) = 2)의 조합으로 LEFT OUTER JOIN을 사용하는 경우 공장. 채워진 빈자리를 쿼리 할 때 함수를 사용하려면 LEFT OUTER JOIN을 유지하고 (bs.booking_status_type_id = 1 또는 bs.booking_status_type_id = 2) 대신 사용해야합니다. –

+0

이 쿼리가 왼쪽 외부 조인에서는 작동하지만 왼쪽 조인에서는 작동하지 않는 이유는 무엇입니까? –

+0

실제로 LEFT JOIN을 사용하면 두 인스턴스에서 모두 작동합니다. –

관련 문제