2009-06-06 17 views
39

में ओरेकल के प्राइवेट द्वारा कनेक्ट की सिमुलेशन मैं एसक्यूएल सर्वर 2000/2005/2008 में ओरेकल के प्राइवेट द्वारा कनेक्ट की कार्यक्षमता प्राप्त करना चाहता हूं?एसक्यूएल सर्वर

कृपया मुझे के रूप में उदाहरण के लिए लागू किया, पुनरावर्ती प्रश्नों को लागू करने के

+0

के बाद से आप अधिक विवरण चाहते हैं लगता है, आप हमें कुछ तालिका संरचना डेटा और क्या आप की कोशिश कर रहे बताने के लिए होगा कर। यदि आपके पास मौजूदा ओरेकल क्वेरी है, तो यह एक अच्छी शुरुआत होगी .... –

+2

@ जॉन, मेरे उत्तर में पोस्ट किया गया यूआरएल देखें, http://www.ibm.com/developerworks/db2/library/techarticle/ डीएम-0510rielau/- यह दिखाता है कि कैसे प्राथमिक काम करता है (वृक्ष संरचनाओं के लिए एक अच्छा लेकिन ओरेकल-मालिकाना वाक्यविन्यास) और सामान्य तालिका अभिव्यक्तियों (रिकर्सिव) के साथ समान प्रभाव कैसे प्राप्त करें, यानी, कीवर्ड के साथ (जो है एक एसक्यूएल मानक और आईबीएम डीबी 2, माइक्रोसॉफ्ट एसक्यूएल सर्वर, और रिलीज में ओपन-सोर्स पोस्टग्रेएसक्यूएल इंजन में कार्यान्वित किया गया 8.4)। –

+0

@Alex: धन्यवाद, मैंने आपकी पोस्ट देखी और लेख पढ़ा। बहुत अच्छा लेख, और मैं देख सकता हूं कि ओरेकल उपयोगकर्ताओं को ओरेकल वाक्यविन्यास क्यों पसंद हो सकता है। मैं मानक वाक्यविन्यास पसंद करता हूं, क्योंकि यह अधिक सामान्य है। –

उत्तर

59

एसक्यूएल मानक तरीका मदद आईबीएम डीबी 2 और SQL Server द्वारा, WITH खंड है। को में अनुवाद करने के एक उदाहरण के लिए this article देखें (तकनीकी रूप से रिकर्सिव सीटीई) - उदाहरण डीबी 2 के लिए है, लेकिन मेरा मानना ​​है कि यह SQL सर्वर पर भी काम करेगा।

संपादित करें: स्पष्ट रूप से मूल querant के लिए एक विशिष्ट उदाहरण की आवश्यकता है, यहां आईबीएम साइट से एक है जिसका यूआरएल मैंने पहले ही दिया है। एक मेज को देखते हुए:

CREATE TABLE emp(empid INTEGER NOT NULL PRIMARY KEY, 
       name VARCHAR(10), 
       salary DECIMAL(9, 2), 
       mgrid INTEGER); 

जहां mgrid संदर्भ एक कर्मचारी के प्रबंधक के empid, काम नहीं है, हर कोई जो Joan को प्रत्यक्ष या परोक्ष रूप रिपोर्ट के नाम मिलता है।

SELECT name 
    FROM emp 
    START WITH name = 'Joan' 
    CONNECT BY PRIOR empid = mgrid 

एसक्यूएल सर्वर, IBM DB2, या PostgreSQL 8.4 (में और साथ ही SQL मानक है कि क्या लायक ;-) है के लिए में, पूरी तरह से बराबर समाधान के बजाय एक पुनरावर्ती है: Oracle में, कि एक साधारण CONNECT है क्वेरी (और अधिक जटिल वाक्य रचना है, लेकिन, वास्तव में, यहां तक ​​कि और अधिक शक्ति और लचीलापन):

WITH n(empid, name) AS 
    (SELECT empid, name 
    FROM emp 
    WHERE name = 'Joan' 
     UNION ALL 
    SELECT nplus1.empid, nplus1.name 
    FROM emp as nplus1, n 
    WHERE n.empid = nplus1.mgrid) 
SELECT name FROM n 

Oracle की START WITH खंड पहले नेस्टेड SELECT, प्रत्यावर्तन के आधार मामला है, हो जाता है UNION पुनरावर्ती हिस्सा है जिसके साथ एड होने के लिए बस एक और SELECT

एसक्यूएल सर्वर का WITH का विशिष्ट स्वाद निश्चित रूप से MSDN पर प्रलेखित है, जो इस कीवर्ड का उपयोग करने के साथ-साथ कई उदाहरणों के लिए दिशानिर्देश और सीमाएं भी प्रदान करता है।

+1

कृपया एक उदाहरण के साथ समझाएं। जैसे URL पर, State2 ऑस्ट्रेलिया --AusState1 --AusStae2 मैं सटीक क्वेरी –

+2

उदाहरण मैं की ओर इशारा रहा हूँ - कुछ देशों ले लो और कहा गया तरह भारत --State1 http://www.ibm.com/developerworks/db2/library/techarticle/dm-0510rielau/, सटीक क्वेरी देता है - इसे यहां कॉपी करना व्यर्थ लगता है जब आप लिंक पर क्लिक कर सकते हैं! -) –

+0

** F ** [इस यूआरएल] पर अनुभाग (https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql) जो मैं खोज रहा था। –

1

मैंने पहले से कनेक्ट नहीं किया है, लेकिन एक त्वरित खोज से पता चलता है कि इसका उपयोग वृक्ष संरचनाओं के लिए किया जाता है। SQL सर्वर में, आप समान कार्यक्षमता प्राप्त करने के लिए सामान्य तालिका अभिव्यक्तियों का उपयोग करते हैं।

+2

कृपया एक उदाहरण के साथ समझाओ। जैसे कुछ देशों ले लो और कहा गया तरह भारत --State1 - State2 ऑस्ट्रेलिया --AusState1 --AusStae2 –

10

@Alex Martelli का जवाब बहुत अच्छा है! लेकिन यह समय (WHERE name = 'Joan') में एक तत्व के लिए ही काम करते हैं, तो आप WHERE खंड बाहर ले, क्वेरी सभी जड़ कतारें लग वापस आ जाएगी ...

मैं मेरी स्थिति के लिए एक छोटा सा बदल गया है, तो यह कर सकते हैं एक मेज के लिए पूरे पेड़ दिखाओ।

तालिका परिभाषा: जड़, 1:

CREATE TABLE [dbo].[mar_categories] ( 
    [category] int IDENTITY(1,1) NOT NULL, 
    [name]  varchar(50) NOT NULL, 
    [level]  int NOT NULL, 
    [action] int NOT NULL, 
    [parent] int NULL, 
    CONSTRAINT [XPK_mar_categories] PRIMARY KEY([category]) 
) 

(level सचमुच एक वर्ग 0 के स्तर पर है जड़ के बाद पहले के स्तर, ...)

और क्वेरी:

WITH n(category, name, level, parent, concatenador) AS 
(
    SELECT category, name, level, parent, '('+CONVERT(VARCHAR (MAX), category)+' - '+CONVERT(VARCHAR (MAX), level)+')' as concatenador 
    FROM mar_categories 
    WHERE parent is null 
     UNION ALL 
    SELECT m.category, m.name, m.level, m.parent, n.concatenador+' * ('+CONVERT (VARCHAR (MAX), case when ISNULL(m.parent, 0) = 0 then 0 else m.category END)+' - '+CONVERT(VARCHAR (MAX), m.level)+')' as concatenador 
    FROM mar_categories as m, n 
    WHERE n.category = m.parent 
) 
SELECT distinct * FROM n ORDER BY concatenador asc 

(आप मैं सिर्फ अधिक पठनीय बनाने के लिए किया था, level क्षेत्र को श्रेणीबद्ध करने की जरूरत नहीं)

इस क्वेरी की तरह कुछ किया जाना चाहिए के लिए इस सवाल का जवाब:

sql return

मुझे आशा है कि यह किसी को मदद करता है!

अब

, मैं कैसे MySQL पर यह करने के लिए सोच रहा हूँ ... ^^

+0

मैं एक गैर एक ही डेटा प्रकारों के साथ अपने कोड अनुकूल एक अजीब मुद्दा था, डेलीमीटर और रिकर्सिव कॉलम पर .... लेकिन यह पहले की लंबाई को स्पष्ट रूप से परिभाषित करने के साथ हल किया गया .... मदद के लिए धन्यवाद! –

+0

संरचना जैसे वृक्ष प्राप्त करने के लिए स्ट्रिंग ('कॉन्सटेनेडोर ') से पथ निर्माण से बचना संभव है (इसलिए प्रत्येक उप-पत्ती मूल्य किसी अन्य तत्वों द्वारा छेद के बिना समूहबद्ध होते हैं)? ओरेकल 'इस तरह से निर्माण के लिए मुफ्त में कनेक्ट करें। – gavenkoa

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