दूसरे चयन के WHERE क्लॉज में SELECT का उपयोग करना


21

मैंने PostrgreSQL के लिए libpq के शीर्ष पर एक ड्राफ्ट रिमोट एप्लिकेशन बनाया है । यह अच्छी तरह से व्यवहार करता है, लेकिन मैंने आवेदन के सामान्य कामकाज की रूपरेखा तैयार की है। मेरे द्वारा उत्पादित प्रत्येक अंतिम व्यावसायिक परिणाम के लिए, ऐसा होता है कि मैं 40 चुनिंदा खंड (tcpip) की तरह कुछ कहता हूं।

मेरे पास दूरस्थ अनुप्रयोग और डेटाबेस के बीच इंटरैक्शन की संख्या को कम करने के लिए मुझे याद दिलाते हुए एसक्यूएल-सर्वर से मुझे याद दिलाया गया है। मेरे चयन का विश्लेषण करने के बाद, मुझे लगता है कि मैं इस संख्या को SELECTजोड़कर 3 खंडों तक कम कर सकता हूं । लेकिन मुझे SELECTदूसरे के परिणाम का उपयोग करने के लिए वाक्यविन्यास याद नहीं है SELECT

उदाहरण के लिए:

SELECT * FROM individual
INNER JOIN publisher
ON individual.individual_id = publisher.individual_id
WHERE individual.individual_id = 'here I would like to use the results of a another select'

यह अन्य SELECTतरह का होगा:

SELECT identifier FROM another_table WHERE something='something'

यहां सरलीकृत तालिकाओं का लेआउट अलग-अलग item_types के लिए कई बार अस्वीकृत हुआ ... (3 बिल्कुल अलग प्रकार, इसलिए अनुकूलित किए जाने पर 3 SQL प्रश्न)।

table passage
  id_passage PK
  business_field_passage bytea

table item
  id_item PK
  id_passage FK
  business_field_item text

table item_detail
  id_item_detail PK
  id_item FK
  business_field_item_detail text
  image_content bytea

id_itemएक के लिए कई हैं id_passage। एक के लिए
कई हैं ।id_item_detailid_item

आप ऐसा कैसे लिखेंगे?
पुनर्निर्देशन की कार्रवाई को दूसरे में चुनने का नाम क्या है (यदि कोई हो)?



क्या आप 7.2.1.3 का जिक्र कर रहे हैं। उपश्रेणियाँ?
स्टीफन रोलैंड

संभवत: हां, एक साथ जॉइन भाग के साथ।
dezso

जवाबों:


30

क्या यह आप के लिए लक्ष्य कर रहे हैं? सुनिश्चित करें कि जिन फ़ील्ड्स की तुलना की जा रही है वे तुलनीय हैं (यानी दोनों फ़ील्ड न्यूमेरिक, टेक्स्ट, बूलियन आदि हैं)।

SELECT * FROM Individual
INNER JOIN Publisher
ON Individual.IndividualId = Publisher.IndividualId
WHERE Individual.IndividualId = (SELECT someID FROM table WHERE blahblahblah)

यदि आप कई मानों के आधार पर चयन करना चाहते हैं:

SELECT * FROM Individual
INNER JOIN Publisher
ON Individual.IndividualId = Publisher.IndividualId
WHERE Individual.IndividualId IN (SELECT someID FROM table WHERE blahblahblah)

यह है कि सीधे आगे हो सकता है ?? क्या यह अभी भी काम करता है अगर SELECT someID FROM table WHERE blahblahblahकई रिकॉर्ड हैं? मैं अभी जाँच करने वाला हूँ।
स्टीफन रोलैंड

कौन सी क्वेरी कई रिकॉर्ड का चयन कर रही है? यदि आप कई रिकॉर्ड का चयन कर रहे हैं तो यह काम कर सकता है, लेकिन यदि आप हमें अपनी तालिका लेआउट दिखा सकते हैं जो हमें उत्तर को परिष्कृत करने में मदद करेगा।
नाराज स्पार्टन

1
WHERE Individual.IndividualId IN...अच्छा लग रहा है।
स्टीफन रोलैंड

10

आप बस इसे फिर से लिख सकते हैं JOIN। यह सामान्य रूप से सबसे सरल और सबसे तेज़ है:

SELECT i.*, p.*
FROM   individual    i
JOIN   publisher     p USING (individualid)
JOIN   another_table a ON a.identifier = i.individualid
WHERE  a.something = 'something'

मैंने भी कुछ हद तक सरलीकृत किया और पहचानने वालों की आभारी कैमलकेस के साथ दूर किया।


1
हां यह। जब भी मैं (SELECT ..) सिंटैक्स देखता हूं, मैं थोड़ा अंदर मर जाता हूं।
मार्क स्टोरी-स्मिथ

@ MarkStorey-Smith क्या आपका मतलब है कि यह सरल और तेज से अधिक है: यह एक मानक के joinबजाय एक और का उपयोग करने के लिए sql कोडिंग का एक मानक है in ( select...)ऐसे मामले में मुझे Erwin के अच्छे उत्तर का भी गुण होना चाहिए।
स्टीफन रोलैंड

1
@StephaneRolland प्लेटफ़ॉर्म और संस्करण आश्रित होगा या नहीं। उदाहरण के लिए SQL Server 2008+ INNER JOIN और IN (SELECT ...) सिंटैक्स के लिए समान निष्पादन योजना तैयार करेगा। PostgreSql पर वही लागू होता है, इस पर कोई विचार नहीं है। एक तरफ प्रदर्शन, IN (SELECT ...) शैली मुझे आश्चर्यचकित करती है अगर लेखक ने एसक्यूएल के शब्दार्थ और अवधारणाओं को पूरी तरह से समझ लिया है। एंग्रीस्पार्टन ने आपके मूल प्रश्न का सही उत्तर दिया है। ErwinBrandstetter ने आपको वह तरीका दिखाया है जो आपको करना चाहिए :)।
मार्क स्टोरी-स्मिथ

6
@ MarkStorey-Smith: एक JOIN हमेशा एक IN कंडीशन के बराबर नहीं होता है। सवाल यह नहीं है कि कौन सा तेज है, सवाल यह है कि कौन सा सही है।
a_horse_with_no_name
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.