/ / SQL - यदि तालिका A रिक्त है तो तालिका B से चयन करें - sql, sql-server, चुनें

एसक्यूएल - टेबल बी से केवल तभी चुनें जब टेबल ए खाली है - एसक्यूएल, एसक्यूएल-सर्वर, चुनें

मेरे पास एक प्राथमिक टेबल एफएक्सटीबी है जिसमें कॉलम हैं; मुद्रा, दर, तिथि (आज की तारीख)।

मैं एक उत्पन्न करना चाहते हैं! तालिका FXTB से चयन करने के लिए SQL, लेकिन अगर मैं इसे एक पुरानी तारीख प्रदान करता हूं (जो 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

एक UNION करो

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 बनाता है और प्रत्येक समूह के लिए 1 रिकॉर्ड का चयन करने के लिए ROW_NUMBER () का उपयोग करते हुए


उत्तर № 3 के लिए 1

यदि आप FXTBHistory से रिकॉर्ड चाहते हैं केवल अगर कोई रिकॉर्ड 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 और 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