Имам първична таблица FXTB, която съдържа колони; валута, курс, дата (само днешна дата).
Искам да генерирам ЕДНО! SQL за избор от таблица FXTB, но ако му осигуря по-стара дата (която не би върнала нищо от FXTB, ще избере от друга таблица, наречена FXTBHistory със същите имена на колони, но съдържащи данни за различни дати.
Моля, уведомете ме, ако не е достатъчно ясно.
Отговори:
1 за отговор № 1За да допълним използваните подходи union
, в това съзвездие a 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 за да го видите в действие.
4 за отговор № 2
Направете СЪЮЗ
SELECT currency, rate, date FROM FXTB WHERE date = @date
UNION
SELECT currency, rate, date FROM FXTBHistory WHERE date = @date
Ако първият резултат е празен - вторият ще предостави резултата. Ако по някаква причина има „дублиращи се записи между 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 () за дял, избира 1-ви запис за всяка група
1 за отговор № 3
Ако искате записи от FXTBHистория само ако няма записи във FXTB за всяка валута на среща:
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 и FXTBHистория на база валута по валута:
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