जब आप JOIN
एक साथ दो या दो से अधिक तालिकाएं, आपको इन तालिकाओं के लिए एक कार्टेशियन उत्पाद प्रभावी रूप से मिलता है, जिसमें एक फ़िल्टर JOIN
में बताया गया है शर्त लागू है।
यह तब अधिक स्पष्ट होता है जब आप एक अप्रचलित निहित JOIN
. का उपयोग करते हैं वाक्य रचना।
LEFT JOIN
गारंटी देता है कि आपको कोई कम नहीं मिलेगा सबसे बाईं तालिका की तुलना में पंक्तियाँ, i. इ। सबसे बाईं तालिका से प्रत्येक पंक्ति कम से कम एक बार लौटा दी जाती है।
यदि फ़िल्टर एक-से-एक पंक्ति मैपिंग नहीं है, तो भी आप और पंक्तियाँ प्राप्त कर सकते हैं।
आपके मामले में:
SELECT (b.descr || ' - ' || c.descr) description
FROM tbl1 a
LEFT JOIN
tbl2 b
ON b.ACCOUNT = a.ACCOUNT
LEFT JOIN
tbl3 c
ON c.product = a.product
WHERE a.descr50 = ' '
या तो acccount
या product
b
. में अद्वितीय नहीं हैं या c
।
इन पंक्तियों के लिए:
a.account
1
2
3
b.account b.description
1 Account 1
2 Account 2 - old
2 Account 2 - new
, JOIN
निम्नलिखित लौटाएगा:
a.account b.account b.description
1 1 Account 1
2 2 Account 2 - old
2 2 Account 2 - new
3 NULL NULL
, आपको किसी भी तालिका में शामिल पंक्तियों की तुलना में अधिक पंक्तियाँ देता है।
किसी भी तालिका से केवल पहला मिलान करने वाला विवरण चुनने के लिए, इसका उपयोग करें:
SELECT (
SELECT FIRST_VALUE(descr) OVER (ORDER BY descr)
FROM tbl2 b
WHERE b.account = a.account
AND rownum = 1
) || ' - ' ||
(
SELECT FIRST_VALUE(descr) OVER (ORDER BY descr)
FROM tbl3 c
WHERE c.product= a.product
AND rownum = 1
) description
FROM tbl1 a
WHERE a.descr50 = ' '
अपडेट करने के लिए, बस क्वेरी को इनलाइन व्यू में लपेटें:
UPDATE (
SELECT (
SELECT FIRST_VALUE(descr) OVER (ORDER BY descr)
FROM tbl2 b
WHERE b.account = a.account
AND rownum = 1
) || ' - ' ||
(
SELECT FIRST_VALUE(descr) OVER (ORDER BY descr)
FROM tbl3 c
WHERE c.product= a.product
AND rownum = 1
) description
FROM tbl1 a
WHERE a.descr50 = ' '
)
SET descr50 = description