/ / SQL - ИЗБЕРЕТЕ от таблица Б само ако таблица А е празна - sql, sql-сървър, изберете

SQL - SELECT от таблица Б само ако таблицата А е празна - sql, sql-server, изберете

Имам първична таблица 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