2010-08-18 2 views
2

나는 다음과 같습니다 일부 SQL을 실행해야합니다Django : 어떻게 명시 적으로 HAVING 절을 사용하여 쿼리를 작성합니까?

select approve_firm_id,approve_dt,approve_result 
from main_approve 
group by approve_firm_id 
having MAX(approve_dt) and approve_result=0; 

그것을 실행 (MySQL의-5.1), 하지만 난 이런 장고 모델에서 시도하는 경우 :

Approve.objects.annotate(max_dt=Max('approve_dt')). 
    filter(max_dt__gt=0).filter(approve_result=0).query 

SELECT `main_approve`.`id`, `main_approve`.`approve_result`, 
`main_approve`.`approve_dt`, `main_approve`.`approve_user_id`, 
`main_approve`.`approve_firm_id`, `main_approve`.`exported_at`, 
MAX(`main_approve`.`approve_dt`) AS `max_dt` FROM `main_approve` 
WHERE (`main_approve`.`approve_result` = 0) 
GROUP BY `main_approve`.`id` 
HAVING MAX(`main_approve`.`approve_dt`) > 0 
ORDER BY NULL 

내가 AFTER로 WHERE 절 필요합니다 생성 쿼리는 이것이다은 GROUP BY 절입니다.

+0

Mike Atlas, 고마워.하지만 실제로는 이전에 실행했던대로 "GROUP BY 절을 __AFTER__하려면 WHERE 절이 필요합니다." –

답변

0

SQL이 효과가 있습니까? having MAX(approve_dt) 부분은 확실히 의심스러워 보입니다. 아마도 다음을 의미합니다.

SELECT DISTINCT 
    main_approve.approve_firm_id, 
    main_approve.approve_dt, 
    main_approve.approve_result 
FROM 
    main_approve 
    JOIN (
     SELECT 
      approve_firm_id, 
      MAX(approve_dt) AS max_dt 
     FROM 
      main_approve 
     GROUP BY 
      approve_firm_id 
    ) AS t 
    ON 
     main_approve.approve_firm_id = t.approve_firm_id 
     AND main_approve.approve_dt = t.max_dt 
WHERE 
    main_approve.approve_result = 0; 

정확한 SQL이 무엇인지 알았 으면 ORM 식을 구성하는 것이 더 쉽습니다.

+0

그것은! 그것은 내가 원하는 방식으로 실행됩니다. 우리가 ROW1 [approve_firm_id = 1 approve_result = 1 approve_dt = 오늘]과 ROW2을 말해봐 [approve_firm_id = 1 approve_result = 0 approve_dt = 어제] 내 (과) SQL 실행 정확한 - Django에 의해 생성 된 다른 하나는 __before__을 정렬하고 approve_firm_id = 1을 사용하여 행을 반환합니다. –

+0

PostgreSQL에서 SQL이 제대로 작동하지 않습니다. 어떤 데이터베이스 서버를 사용하고 있습니까? MySQL은? 어쨌든, HAVING 절이 부울 식만 받아 들여야하므로 SQL이 데이터베이스 서버에서 작동하더라도 장고 ORM이 동일한 SQL을 생성 할 수 없다고 생각합니다. 대신 게시 한 SQL을 기반으로 ORM 표현식을 다시 작성해 보셨습니까? – sayap

관련 문제