2012-07-12 4 views
1

프로 시저에서 select 문을 만들려고합니다. 내가 max(a.time)max(b.time) 사이의 마지막 날짜를 취할 필요가select 문에서 두 날짜의 마지막 날짜를 얻는 방법

SELECT u.id, max(a.time), max(b.time) 
FROM buy a, sell b, users u 
WHERE a.user_id = u.id AND b.user_id = u.id 
GROUP BY u.id; 

:

여기 내 코드입니다.

SELECT u.id, case when a_max > b_max then a_max else b_max end 
FROM (SELECT u.id, max(a.time) as a_max, max(b.time) as b_max 
    FROM buy a, sell b, users u 
    WHERE a.user_id = u.id AND b.user_id = u.id 
    GROUP BY u.id) x; 

내부 쿼리가 인덱스를 사용할 수 그들이 최대를 얻기 위해 존재하는 경우 : 훨씬 더 효율적이 될 것입니다 귀하의 DB는 앨리어스 쿼리를 지원하는 경우

+0

사용 CASE. – Narendra

+0

어떤 DBMS를 사용하고 있습니까? –

답변

2
SELECT u.id, max(case when a.time > b.time then a.time else b.time end) 
FROM buy a, sell b, users u 
WHERE a.user_id = u.id AND b.user_id = u.id 
GROUP BY u.id; 

는,이 시도 사전에

감사합니다 각 열에 대해 신속하게 이것에 대해

SELECT u.id, max(case when a.time > b.time then a.time else b.time end) 
FROM buy a 
JOIN sell b ON b.user_id = u.id 
JOIN users u ON a.user_id = u.id 
GROUP BY u.id; 
+0

정말 좋은 생각입니까? 분명히 집계해야 집계 주위에 사례를 포장해야합니까? 이렇게하면 옵티 마이저가 작업 부하를 줄일 수있는 기회가 늘어납니다. – MatBailie

+0

sql-developer가 별칭이 지정된 쿼리를 지원하는지는 모르지만 편집 된 대답은 – Bohemian

+0

입니다.이 쿼리를 최적화하는 방법이 있습니까? – Ofer

3

무엇을 : 우리가에있는 동안



, 이제 다시 코드는 현대 조인 구문을 사용하자? ㄴ '과 b.time에 대한

SELECT 
    u.id, 
    CASE 
    WHEN max(a.time) > max(b.time) THEN max(a.time) 
    ELSE max(b.time) 
    END 
FROM buy a, sell b, users u 
WHERE a.user_id = u.id AND b.user_id = u.id 
GROUP BY u.id; 
+0

이렇게하면 4 개의 max() 함수가 계산됩니다. – Bohemian

+0

'CASE'를'CASE WHEN'으로 변경합니까? – MatBailie

+0

@ 보헤미안 - 내 지식이 아닙니다. MAX (a.time)를 한 번 계산하고 결과를 두 번 사용합니다. – MatBailie

0
SELECT U.ID, 
CASE WHEN MAX(A.TIME) > MAX(B.TIME) THEN MAX(A.TIME) 
    ELSE MAX(B.TIME) 
END 
FROM BUY A, SELL B, USERS U 
WHERE A.USER_ID = U.ID AND B.USER_ID = U.ID 
GROUP BY U.ID; 
관련 문제