列を含むプライマリテーブルFXTBがあります。通貨、レート、日付(今日の日付のみ)。
ONEを生成したい! テーブルFXTBから選択するSQL 列名は同じですが、異なる日付のデータが含まれています。
明確でない場合はお知らせください。
回答:
回答№1は1を使用してアプローチを補完するには union
、この星座で 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 それを実際に見るために。
回答№2については4
UNIONを行う
SELECT currency, rate, date FROM FXTB WHERE date = @date
UNION
SELECT currency, rate, date FROM FXTBHistory WHERE date = @date
最初の結果が空の場合-2番目が結果を提供します。何らかの理由で2つの結果の間にエントリが重複している場合-UNIONは重複を排除します
まったく重複していない場合(異なる日付、コメントによると同じ日付の場合)に、記録のみに関心がある場合-このようなものを試すことができます(テストされていません)
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を構築し、パーティション化にROW_NUMBER()を使用すると、すべてのグループの最初のレコードが選択されます
回答№3の場合は1
FXTBにレコードが存在しない場合にのみFXTBHistoryからレコードが必要な場合 どの通貨でも @date:
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
@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