2014-05-22 3 views
0

컬럼이 들어있는 기본 테이블 FXTB가 있습니다. 통화, 이자율, 날짜 (오늘 날짜 만).테이블 A가 비어있는 경우에만 테이블 B의 SELECT

하나 생성하고 싶습니다! SQL에서 테이블 FXTB를 선택할 수 있지만 이전 날짜 (FXTB에서 아무 것도 반환하지 않는 FXTBHistory )를 선택하면 다른 날짜의 데이터가 들어 있지만 같은 열 이름을 사용합니다.

충분히 명확하지 않습니다 알고

+0

@Yuriy Galanter의 대답은 올바른, 당신은 테이블 중 하나가 널인지, 노동 조합을해야 할,이 반환된다 2 개의 테이블을 제공하는 모든 데이터는 동일한 테이블 스키마를 유지합니다! –

+0

문제의 요율 값이 ... 작은 십진수의 차이로 인해 중복 값이 ​​발생합니다. – Achilles

답변

1

대한 첫번째 기록을 선택하는 LEFT OUTER JOIN도 가능하다. ifnullFXTB 값을 반환하며, 그들이 null을 경우에만의 FXTBHistory 값이 반환됩니다

SELECT ifnull(FXTB.currency, FXTBHistory.currency) as currency, 
     ifnull(FXTB.rate, FXTBHistory.rate) as rate, 
     ifnull(FXTB.date, FXTBHistory.date) as date 
FROM FXTBHistory LEFT OUTER JOIN FXTB 
    ON FXTBHistory.currency = FXTB.currency 
    AND FXTBHistory.date = FXTB.date 
    WHERE ifnull(FXTB.date, FXTBHistory.date) = @date 
UNION 
SELECT ifnull(FXTB.currency, FXTBHistory.currency) as currency, 
     ifnull(FXTB.rate, FXTBHistory.rate) as rate, 
     ifnull(FXTB.date, FXTBHistory.date) as date 
FROM FXTBHistory RIGHT OUTER JOIN FXTB 
    ON FXTBHistory.currency = FXTB.currency 
    AND FXTBHistory.date = FXTB.date 
    WHERE ifnull(FXTB.date, FXTBHistory.date) = @date; 

행동에 그것을보고 http://sqlfiddle.com/#!2/c97e23/6를 참조하십시오.

SELECT currency, rate, date 
FROM FXTB 
WHERE date = @date 
UNION ALL 
SELECT currency, rate, date 
FROM FXTBHistory 
WHERE date = @date 
    AND NOT EXISTS (SELECT 1 FROM FXTB WHERE date = @date) 

당신은 통화 별에 FXTB 및 FXTBHistory 사이에 선택하려면 :

+0

현재이 문제를 조사하고 있습니다 ... – Achilles

+0

사실, 내력 테이블에 오늘 레코드가 없지만 fxtb 테이블은 그렇지 않습니다. . 나는 더 나은 해결책으로 나의 대답을 업데이트했다. –

+0

이것은 훨씬 좋아 보인다 ...하지만 두 쿼리 모두 결과를 가져온다면 ...? 대부분의 통화에 대해 요금은 동일 할 수 있지만 잠재적으로 작은 10 진수 차이가있을 수 있으며 동일한 통화에 대해 중복 행을 초래할 수 있습니까? – Achilles

4

를 첫 번째 결과가 비어 있으면

SELECT currency, rate, date FROM FXTB WHERE date = @date 
UNION 
SELECT currency, rate, date FROM FXTBHistory WHERE date = @date 

을 노조를 수행 -. 두 번째는 결과를 제공 할 것입니다 몇 가지 이유로 두 결과 사이에 중복 된 항목이 있다면 -. UNION 것이다 중복을 제거하십시오

경우 0

당신은 (같은 날짜 귀하의 의견에 따라 다른 속도) 꽤 중복을받을 수 있지만 당신은 단지 기록에 점점 관심이 -이 같은 (테스트하지)

WITH FXTBAll AS 
    (SELECT currency, rate, date, ROW_NUMBER() OVER (PARTITION BY currency, date ORDER BY currency, date) RN FROM 
     (SELECT currency, rate, date FROM FXTB WHERE date = @date 
     UNION 
     SELECT currency, rate, date FROM FXTBHistory WHERE date = @date) T 
    ) 
SELECT currency, rate, date FROM FXTBAll WHERE RN = 1 
을 시도 할 수 있습니다

그것은 여전히 ​​성상, 동일한 UNION을 사용하지만, 그것의 위에 CTE를 builts 및 파티셔닝) (ROW_NUMBER를 사용 union를 이용한 방법을 보완 할 수있는 모든 그룹

+0

UNION의 문제는 데이터가 두 테이블에 모두 있지만 비율 값에 소수점 차이가있는 경우 중복 값을 반환한다는 것입니다. – Achilles

+0

@Achilles, 데이터가 'FXTB'에서'FXTBHistory '로 이동 된 것처럼 들리므로 중복이 없어야합니다. – christiandev

+0

@Achilles 그래서 환율과 날짜가 두 테이블에서 동일하지만 환율 만 다릅니다. 당신은 2 테이블에서 같은 날짜와 다른 속도를 가질 수 있습니까? –

1

당신은 레코드가 @date에 어떤 통화에 대한 FXTB 에 존재하지 않는 경우에만 FXTBHistory에서 레코드를 원하는 경우 -currency 기준 :

SELECT 
@date        AS date, 
COALESCE(new.currency, old.currency) AS currency, 
COALESCE(new.rate , old.rate)  AS rate 
FROM FXTB new 
FULL JOIN FXTBHistory old ON (
    new.currency = old.currency AND 
    new.date  = old.date 
) 
WHERE new.date = @date 
    OR old.date = @date 
관련 문제