2012-09-22 14 views
5

क्या एसक्यूएल अभिव्यक्ति NOT IN का समतुल्य बीजगणित समतुल्य है?रिलेशनल बीजगणित एसक्यूएल के बराबर "नहीं"

A1 | A2 
---------- 
x | y 
a | b 
y | x 

मैं संबंध है जिसके लिए A1, A2 में है में सभी tuples निकालना चाहते हैं:

उदाहरण के लिए अगर मैं रिश्ता नहीं है। एसक्यूएल में मैं क्वेरी हो सकता है:

SELECT 
    * 
FROM 
    R 
WHERE 
    R.A1 NOT IN 
     (
     SELECT 
      A2 
     FROM 
      R 
     ) 
/

क्या वास्तव में मुझे स्टंपिंग है संबंधपरक बीजगणित चयन ऑपरेटर अंदर सबक्वेरी के लिए कैसे है, यह संभव ?:

σ यहाँ कुछ सबक्वेरी आर

उत्तर

6

में है संबंधपरक बीजगणित, आप इसे एक कार्टेशियन उत्पाद का उपयोग कर कर सकते हैं। कुछ की तरह:

आर - ρ A1, A2 ( π A11, A21 A11 = A22 ( A11, A21 (आर) ρ एक्स ρ A12, A22 (आर))))

  • आर, फी के कॉलम का नाम बदलें a1 A11 (बाएं हाथ) और A12 (दाहिने हाथ) से
  • बदले नामों वाले कॉलमों के साथ आर के के पार उत्पाद ले
  • चयन पंक्तियों जहां A11 के बराबर होती है A22
  • परियोजना बाहर A12 और A22 और A11 रखने और A21
  • A1 और A2

कि आपको पंक्तियों से मिलान किया गया देता है नाम बदलें। पंक्तियों को खोजने के लिए आर से इसे घटाएं जहां मिलान नहीं किया गया है।

+1

आप कर सकते हैं कृपया समझा यह कैसे काम करता है ... और शायद अंडाकार डॉट्स का विस्तार करें। मुझे क्रॉस उत्पाद के नतीजे को समझने में परेशानी हो रही है, आर में केवल दो फ़ील्ड हैं, तो आप दो से अधिक तर्कों के साथ पीआई ऑपरेटर को कैसे डाल सकते हैं? – jsj

+0

यदि केवल दो कॉलम हैं तो आप इलिप्सिस डॉट्स को छोड़ सकते हैं। उत्तर ने पीआई का भी उपयोग किया जहां इसे आरएचओ का इस्तेमाल करना चाहिए था, यह सुनिश्चित नहीं है कि वह संपादन या मूल उत्तर में था या नहीं। – Andomar

+0

@Andomar: मुझे रिलेशनल बीजगणित प्रश्न में भी समस्याएं आ रही हैं। मैंने अपना प्रश्न पोस्ट किया है [यहां] (http://stackoverflow.com/questions/18997845/how-to-convert-sql-to-relational-algebra-in-case-of-sql-joins)। क्या आप कृपया मेरी मदद कर सकते हैं? धन्यवाद। –

2

उद्घाटन प्रश्न हमें गलत सोच भेज रहा है। यह होना चाहिए:

क्या एसक्यूएल अभिव्यक्ति R WHERE ... [NOT] IN S का समतुल्य बीजगणित समतुल्य है?

जवाब है हाँ, यह (प्राकृतिक) JOIN bowtie ऑपरेटर उर्फ ​​है (यही है, इस सवाल का जवाब दो संबंधों, नहीं फिल्टर के कुछ प्रकार। के बीच कुछ आपरेशन है)।

यह देखने के लिए कि क्यों पहले दिए गए SQL समाधान को व्यवस्थित करें। जैसा कि दिखाया गया है, यह विशेषता A1 NOT IN विशेषता के साथ एक विशेषता A2 के साथ एक संबंध की तलाश में है। यह विशेषता नामों में वास्तव में एक गलत मिलान है। एसक्यूएल जहां स्थिति के अंदर NOT की अनुमति देता है। यह एसक्यूएल लॉजिकल स्ट्रक्चर स्पष्ट बनाता है:

SELECT * FROM R 
WHERE NOT (A1 IN (SELECT A2 AS A1 FROM R)) 

अब हम एक प्रक्षेपण और नाम देख सकते हैं। (आसपास के NOT हम पहले उत्तर के अनुसार सेट MINUS के रूप में कार्यान्वित कर सकते हैं।) तो बराबर आरए है:

R - (R ⋈ ρ A1/A2 ए 2(R)))

ब्याज के लिए, ट्यूटोरियल डी है:

R MINUS (R JOIN (R {A2} RENAME A2 AS A1)) 

तरह से सवाल डाल दिया जाता है, वहाँ है एसक्यूएल सोच से एक हैंगओवर। एसक्यूएल के WHERE आपको पंक्ति-स्तर 'मोड' में मजबूर करता है। यह कॉडड नियम 7 को संकुचित करता है जिसमें सेट-ए-टाइम ऑपरेटर की आवश्यकता होती है।

सामान्य तौर पर, एसक्यूएल के WHERE और आरए के σ उनकी पंक्ति-स्तर फिल्टर के साथ और अधिक संक्षेप के रूप में (प्राकृतिक) सेट पर एक समय तर्क के साथ JOIN लागू किया जा सकता। (उदाहरण के लिए, यह है कि क्या दिनांक & डार्वेन उनके एक बीजगणित में क्या है।)

संबंधित मुद्दे