Postgres में [FROM x, y] का क्या अर्थ है?


12

मैं अभी पोस्टग्रेज से शुरुआत कर रहा हूं। इस दस्तावेज़ को पढ़कर मुझे यह प्रश्न आया:

SELECT title, ts_rank_cd(textsearch, query) AS rank
FROM apod, to_tsquery('neutrino|(dark & matter)') query
WHERE query @@ textsearch
ORDER BY rank DESC
LIMIT 10;

मैं इस क्वेरी में सब कुछ समझ सकते हैं, सिवाय इस बात के लिए: FROM apod, ...

इसका क्या ,मतलब है? मुझे जॉइन करने की आदत है लेकिन FROMकॉमा द्वारा अलग किए गए कई स्टेटमेंट्स की नहीं ।

मैंने बिना किसी लाभ के नेट खोजा। इसे देखने और सोचने के बाद, यह मुझे लगता है कि यह क्वेरी नामक एक चर घोषित कर रहा है, इसलिए यह इसे कई बार उपयोग कर सकता है। लेकिन अगर यह सच है, तो इसका क्या करना है FROM?

जवाबों:


10

यह एक निहित बनाता है CROSS JOIN। यह SQL-89 सिंटेक्स है।

यहाँ मैं केवल उदाहरणों के लिए pseduo-tables (वैल्यू टेबल) का उपयोग values(1)और values(2)निर्माण करता हूँ। उनके बाद की बात t(x), और FROM-Aliasesg(y) कहा जाता है कोष्ठक के अंदर का चरित्र स्तंभ के लिए उपनाम ( और क्रमशः) है। आप इसे आसानी से परीक्षण करने के लिए एक तालिका बना सकते हैं।xy

SELECT *
FROM (values(1)) AS t(x), (values(2)) AS g(y)

यहां बताया गया है कि आप इसे अब कैसे लिखेंगे।

SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(2)) AS g(y);

वहां से आप INNER JOINएक सशर्त जोड़कर इसे एक अंतर्निहित बना सकते हैं।

SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(1)) AS g(z)
WHERE x = z;

या स्पष्ट और नए INNER JOINवाक्यविन्यास,

SELECT *
FROM (values(1)) AS t(x)
INNER JOIN (values(1)) AS g(z)
  ON ( x = z );

तो आपके उदाहरण में ..

FROM apod, to_tsquery('neutrino|(dark & matter)') query

यह अनिवार्य रूप से नए वाक्य विन्यास के समान है,

FROM apod
CROSS JOIN to_tsquery('neutrino|(dark & matter)') AS query

जो वास्तव में एक ही है, इस मामले में, क्योंकि to_tsquery()एक पंक्ति लौटाती है और एक सेट के रूप में नहीं,

SELECT title, ts_rank_cd(
  textsearch,
  to_tsquery('neutrino|(dark & matter)')
) AS rank
FROM apod
WHERE to_tsquery('neutrino|(dark & matter)') @@ textsearch
ORDER BY rank DESC
LIMIT 10;

हालांकि, इसके बाद के संस्करण संभावित कारण बन सकता है to_tsquery('neutrino|(dark & matter)')- दो बार होते हैं, लेकिन इस मामले में यह नहीं है to_tsqueryके रूप में चिह्नित किया गया है स्थिर (के साथ सत्यापित \dfS+ to_tsquery)।

STABLEइंगित करता है कि फ़ंक्शन डेटाबेस को संशोधित नहीं कर सकता है, और यह कि एकल टेबल स्कैन के भीतर यह समान तर्क मानों के लिए लगातार परिणाम देगा, लेकिन इसका परिणाम SQL बयानों में बदल सकता है। यह उन कार्यों के लिए उपयुक्त चयन है जिनके परिणाम डेटाबेस लुकअप, पैरामीटर चर (जैसे कि वर्तमान समय क्षेत्र), आदि पर निर्भर करते हैं (यह AFTER ट्रिगर्स के लिए अनुचित है जो वर्तमान कमांड द्वारा संशोधित पंक्तियों को क्वेरी करना चाहते हैं।) यह भी ध्यान दें। फ़ंक्शंस के current_timestamp परिवार स्थिर के रूप में योग्य हैं, क्योंकि उनके मूल्य लेन-देन के भीतर नहीं बदलते हैं।

SQL-89, और SQL-92 के बीच अंतर की पूरी तुलना के लिए, यहां मेरा जवाब भी देखें


आपका बहुत बहुत धन्यवाद। मैं अभी SQL से शुरू कर रहा हूँ। यह ,एक क्रॉस ज्वाइन होने के लिए समझ में आता है क्योंकि यह एक कार्टेशियन उत्पाद है और इसमें कोई तुलना शामिल नहीं है। क्या आप केवल 1 और प्रश्न का उत्तर दे सकते हैं? क्या है t(x)में (values(1)) AS t(x)???
andrerpena

@andrerpena अपडेट किया गया।
इवान कैरोल

1
आप सबसे अच्छे हो। क्रिस्टल स्पष्ट व्याख्या। अनेक अनेक धन्यवाद।
andrpena

" टेबल से उपनाम" के लिए शब्द कभी नहीं सुना । to_tsquery()एक मान एक पंक्ति नहीं देता है । और सिर्फ इसलिए कि एक समारोह परिभाषित किया गया है STABLE, कि इसका मतलब यह नहीं क्वेरी योजनाकार होगा दोहराया मूल्यांकन से बचें। यह कर सकते हैं
एरविन ब्रान्डेसटेटर

12

अध्याय तालिका में सूची में अल्पविराम केFROM लिए मैनुअल में विस्तृत विवरण दिया गया है :

FROMखण्ड अल्पविराम से अलग की मेज संदर्भ सूची में दिए गए एक या अधिक अन्य तालिकाओं से एक मेज उत्पन्न हुआ है।

FROM table_reference [, table_reference [, ...]]

एक तालिका संदर्भ एक तालिका नाम (संभवतः स्कीमा-योग्य), या एक व्युत्पन्न तालिका जैसे कि एक उपश्रेणी, एक JOINनिर्माण, या इनमें से जटिल संयोजन हो सकता है। यदि FROMखंड में एक से अधिक तालिका संदर्भ सूचीबद्ध हैं , तो तालिकाएं क्रॉस-ज्वाइन की जाती हैं (अर्थात, उनकी पंक्तियों का कार्टेशियन उत्पाद बनता है; नीचे देखें)।

तथ्य यह है कि अल्पविराम से अलग तालिका संदर्भों को स्पष्ट JOINवाक्य रचना की तुलना में SQL मानक के पुराने संस्करण में परिभाषित किया गया है, यह अल्पविराम को गलत या पुराना नहीं बनाता है। स्पष्ट रूप से सम्मिलित वाक्य-विन्यास का उपयोग करें, जहाँ यह तकनीकी रूप से आवश्यक है (नीचे देखें) या जहाँ यह क्वेरी पाठ को स्पष्ट करता है।

मैनुअल फिर से:

FROM T1 CROSS JOIN T2के बराबर है FROM T1 INNER JOIN T2 ON TRUE (नीचे देखें)। इसके बराबर भी है FROM T1, T2

लेकिन "समतुल्य" का मतलब समान नहीं है । एक सूक्ष्म अंतर है, मैनुअल नोट्स के रूप में :

नोट
यह बाद की तुल्यता ठीक से पकड़ नहीं है जब दो से अधिक टेबल दिखाई देते हैं, क्योंकि JOINअल्पविराम से अधिक कसकर बांधता है। उदाहरण के लिए FROM T1 CROSS JOIN T2 INNER JOIN T3 ON conditionऐसा नहीं है FROM T1, T2 INNER JOIN T3 ON conditionक्योंकि पहले मामले में conditionसंदर्भ हो सकता है T1लेकिन दूसरा नहीं।

यह संबंधित प्रश्न अंतर की प्रासंगिकता दर्शाता है:

मूल रूप से, आपका अवलोकन बिलकुल सही है:

यह मुझे लगता है कि यह क्वेरी नामक एक चर घोषित कर रहा है ताकि यह इसे कई बार उपयोग कर सके।

किसी भी फ़ंक्शन का उपयोग सूची में "टेबल फ़ंक्शन" के रूप में किया जा सकता है FROM। और फ़ंक्शन पैरामीटर फ़ंक्शन के बाईं ओर सभी तालिकाओं से स्तंभों को संदर्भित कर सकते हैं, क्योंकि संकेतन:

FROM apod, to_tsquery('neutrino|(dark & matter)') query

वास्तव में इसके बराबर है:

FROM apod CROSS JOIN LATERAL to_tsquery('neutrino|(dark & matter)') AS query

स्थानीय प्रश्नों पर मैनुअल:

इसमें प्रदर्शित होने वाले टेबल फ़ंक्शन FROMभी मुख्य शब्द से पहले हो सकते हैं LATERAL, लेकिन फ़ंक्शंस के लिए कुंजी शब्द वैकल्पिक है ; फ़ंक्शन के तर्कों में किसी भी मामले में FROM आइटम से पहले दिए गए कॉलम के संदर्भ शामिल हो सकते हैं।

बोल्ड जोर मेरा।

कीवर्डAS पूरी तरह से पहले वैकल्पिक शोर है तालिका उपनाम (के रूप में करने का विरोध किया स्तंभ उपनाम है, जहां यह न करने का विकल्प नहीं अनुशंसा की जाती है ASसंभव अस्पष्टता से बचने के लिए)। अधिक के साथ संबंधित जवाब:

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.