/ / SQL-テーブルAが空の場合にのみテーブルBからSELECT-sql、sql-server、select

SQL - テーブルAが空の場合のみテーブルBからのSELECT - sql、sql-server、select

列を含むプライマリテーブルFXTBがあります。通貨、レート、日付(今日の日付のみ)。

ONEを生成したい! テーブルFXTBから選択するSQL 列名は同じですが、異なる日付のデータが含まれています。

明確でない場合はお知らせください。

回答:

回答№1は1

を使用してアプローチを補完するには union、この星座で LEFT OUTER JOIN も可能です。の ifnull その FXTB 値、およびそれらが nullFXTBHistory 値が返されます:

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