컬럼이 들어있는 기본 테이블 FXTB가 있습니다. 통화, 이자율, 날짜 (오늘 날짜 만).테이블 A가 비어있는 경우에만 테이블 B의 SELECT
하나 생성하고 싶습니다! SQL에서 테이블 FXTB를 선택할 수 있지만 이전 날짜 (FXTB에서 아무 것도 반환하지 않는 FXTBHistory )를 선택하면 다른 날짜의 데이터가 들어 있지만 같은 열 이름을 사용합니다.
충분히 명확하지 않습니다 알고
컬럼이 들어있는 기본 테이블 FXTB가 있습니다. 통화, 이자율, 날짜 (오늘 날짜 만).테이블 A가 비어있는 경우에만 테이블 B의 SELECT
하나 생성하고 싶습니다! SQL에서 테이블 FXTB를 선택할 수 있지만 이전 날짜 (FXTB에서 아무 것도 반환하지 않는 FXTBHistory )를 선택하면 다른 날짜의 데이터가 들어 있지만 같은 열 이름을 사용합니다.
충분히 명확하지 않습니다 알고
대한 첫번째 기록을 선택하는 LEFT OUTER JOIN
도 가능하다. ifnull
는 FXTB
값을 반환하며, 그들이 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 사이에 선택하려면 :
를 첫 번째 결과가 비어 있으면
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
를 이용한 방법을 보완 할 수있는 모든 그룹
UNION의 문제는 데이터가 두 테이블에 모두 있지만 비율 값에 소수점 차이가있는 경우 중복 값을 반환한다는 것입니다. – Achilles
@Achilles, 데이터가 'FXTB'에서'FXTBHistory '로 이동 된 것처럼 들리므로 중복이 없어야합니다. – christiandev
@Achilles 그래서 환율과 날짜가 두 테이블에서 동일하지만 환율 만 다릅니다. 당신은 2 테이블에서 같은 날짜와 다른 속도를 가질 수 있습니까? –
당신은 레코드가 @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
@Yuriy Galanter의 대답은 올바른, 당신은 테이블 중 하나가 널인지, 노동 조합을해야 할,이 반환된다 2 개의 테이블을 제공하는 모든 데이터는 동일한 테이블 스키마를 유지합니다! –
문제의 요율 값이 ... 작은 십진수의 차이로 인해 중복 값이 발생합니다. – Achilles