2011-12-19 2 views
0

여러 시간에 서로 다른 데이터를 로깅하는 장치가 있고 시간별로 정렬 된 단일 쿼리에서 모든 데이터를 가져 오려고합니다. 테이블의 종류의 예는 내가 가진 :이 테이블을 어떻게 가입시킬 수 있습니까?

CREATE TABLE location(
    device_id INT, -- REFERENCES device(id) 
    timestamp DATETIME2 NOT NULL, 
    position GEOMETRY NOT NULL 
) 

CREATE TABLE temperature(
    device_id INT, -- REFERENCES device(id) 
    timestamp DATETIME2 NOT NULL, 
    temp FLOAT NOT NULL 
) 

내가 타임 스탬프가 일치하지 않을 때 널 (null)을 포함 DEVICE_ID와 타임 스탬프에 테이블을 조인 단일 쿼리를 갖고 싶어. 내가 추구하고 출력 형식의 예는 다음과 같습니다 나는 FULL 일을 시도했습니다

device_id, timestamp, location, temperature 
1, 2011/12/1 10:00:00, (35.1, 139.2), NULL 
1, 2011/12/1 10:00:01, NULL, 9.0 
1, 2011/12/1 10:00:02, (35.1, 139.2), 9.1 

이 가입하지만 거대한 CASE 문없이 타임 스탬프 열을 수행하는 방법 (명심 알아낼 수 없습니다 난 단지 보여준 있지만, 2 개의 테이블, 이것에는 더 많은 것이있을 수있다).

SELECT 
    location.device_id, 
    CASE WHEN location.timestamp IS NOT NULL THEN 
     location.timestamp 
    ELSE 
     temperature.timestamp 
    END as timestamp, 
    location, 
    temp 
FROM 
    location 
    FULL JOIN temperature ON location.device_id = temperature.device_id 
     AND location.timestamp = temperature.timestamp 
ORDER BY 
    timestamp 

이런 종류의 쿼리를 작성하는 간단한 방법이 있습니까?

답변

5

COALESCE 표현식을 사용할 수 있습니다.

SELECT 
    location.device_id, 
    COALESCE(location.timestamp, temperature.timestamp) as timestamp, 
    position, 
    temp 
FROM 
    location 
    FULL JOIN temperature ON location.device_id = temperature.device_id 
     AND location.timestamp = temperature.timestamp 
ORDER BY 
    timestamp; 
+0

coalesce 연산자를 사용하면 작업이 수행됩니다. isnull() 연산자는 동일한 작업을 수행하지만 2 개의 매개 변수 만 허용하고 병합은 많은 매개 변수를 허용합니다. – AndrewBay

+0

매력처럼 작동합니다! 많은 감사합니다! – brianestey

0

예, 온도 테이블에 OUTER 결합을 사용할 수 있습니다. 온도 테이블에 일치하는 행이없는 경우 null이 반환됩니다. 다음과 같이

0

당신은 DEVICE_ID/타임 스탬프를 얻기 위해 COALESCE이 필요합니다

SELECT 
    COALESCE(l.device_id, t.device_id) as device_id, 
    COALESCE(l.timestamp, t.timestamp) as timestamp, 
    l.position as location, 
    t.temp as temperature 
FROM location l 
FULL JOIN temperature t ON l.device_id = t.device_id 
    AND l.timestamp = t.timestamp 
ORDER BY 2 

도 매우 짧은 이름 (L과 t)와 테이블을 앨리어싱에 의해 증가 된 가독성을 확인합니다. 당신은 당신의 순서를 검토 할 수 있습니다

는 - 아마 당신은 ORDER BY 1, 2을 원하는 대신

0
SELECT device_id, timestamp, position, NULL AS temp 
    FROM location 
UNION ALL 
SELECT device_id, timestamp, NULL AS position, temp 
    FROM temperature 
ORDER 
    BY timestamp; 

ALL 키워드가 여기에 필요한 참고.

관련 문제