2011-05-01 19 views
6

मैं एक पोस्टग्रेएसक्यूएल को SQL सर्वर में कनवर्ट करने की कोशिश कर रहा हूं। लेकिन यह सवाल काम नहीं करता है।एएस का उपयोग कर सीटीई से चुनें? एसक्यूएल सर्वर 2008

मैं क्या गलत कर रहा हूं? मैंने पहले से अर्धविराम जोड़ने की कोशिश की लेकिन कोई किस्मत नहीं।

SELECT 
     member_a AS you, member_b AS mightknow, shared_connection, 
     CASE 
     WHEN (n1.member_job_country = n2.member_job_country AND n1.member_job_country = n3.member_job_country) THEN 'country in common' 
     WHEN (n1.member_unvan_id = n2.member_unvan_id AND n1.member_unvan_id = n3.member_unvan_id) THEN 'unvan in common' 
     ELSE 'nothing in common' 
     END AS reason 
    FROM (
     WITH transitive_closure(member_a, member_b, distance, path_string, direct_connection) AS 
     (SELECT 
      member_a, member_b, 1 AS distance, 
      CAST(member_a as varchar(MAX)) + '.' + CAST(member_b as varchar(MAX)) + '.' AS path_string, 
      member_b AS direct_connection 
     FROM Member_Contact_Edges 
     WHERE member_a = 45046 -- set the starting node 

     UNION ALL 

     SELECT 
      tc.member_a, e.member_b, tc.distance + 1, 
      CAST(tc.path_string as varchar(MAX)) + CAST(e.member_b as varchar(MAX)) + '.' AS path_string, 
      tc.direct_connection 
     FROM Member_Contact_Edges AS e 
     JOIN transitive_closure AS tc ON e.member_a = tc.member_b 
     WHERE tc.path_string NOT LIKE '%' + CAST(e.member_b as varchar(MAX)) + '.%' 
     AND tc.distance < 2 
     ) 

    SELECT 
     member_a, member_b,direct_connection AS shared_connection 
    FROM transitive_closure 
    WHERE distance = 2 
) AS youmightknow 
    LEFT JOIN Members AS n1 ON youmightknow.member_a = n1.memberID 
    LEFT JOIN Members AS n2 ON youmightknow.member_b = n2.memberID 
    LEFT JOIN Members AS n3 ON youmightknow.shared_connection = n3.memberID 
    WHERE (n1.member_job_country = n2.member_job_country 
     AND n1.member_job_country = n3.member_job_country) 
     OR (n1.member_unvan_id = n2.member_unvan_id 
      AND n1.member_unvan_id = n3.member_unvan_id); 

त्रुटि मैं:

संदेश 156, स्तर 15, राज्य 1, रेखा कीवर्ड 'के साथ' के पास 11
गलत वाक्य रचना।
संदेश 319, स्तर 15, राज्य 1, रेखा 11
कीवर्ड 'के साथ' के भीतर गलत वाक्यविन्यास। यदि यह कथन सामान्य तालिका अभिव्यक्ति है, तो xmlnamespaces खंड या ट्रैकिंग संदर्भ खंड को बदलने, पिछले कथन को सेमिकोलन के साथ समाप्त कर दिया जाना चाहिए।
संदेश 102, स्तर 15, राज्य 1, रेखा 34
') के पास गलत वाक्यविन्यास।

यहां संदर्भ है; Graphs in the Database - SQL Meets Social Networks - लेख के निचले हिस्से में फेसबुक सुझाव भाग देखें।

अग्रिम धन्यवाद

उत्तर

6

CTE घोषणा शीर्ष पर जाने की जरूरत है। सीटीई और व्युत्पन्न तालिकाओं को मिश्रण करने के बजाय आप कई सीटीई घोषित कर सकते हैं और अल्पविराम से जुड़ सकते हैं।

;WITH 
/*First CTE declaration*/ 
transitive_closure(member_a, member_b, distance, path_string, direct_connection) 
AS 
( 
    ... 
), 
/*Second CTE declaration*/ 
youmightknow AS 
(
SELECT member_a, member_b,direct_connection AS shared_connection 
FROM transitive_closure 
WHERE distance = 2 
)   
SELECT member_a AS you, 
... 
FROM youmightknow 
+0

धन्यवाद @ मार्टिन अब एक आकर्षण की तरह काम कर रहा है और @ माइकल लुडविग: संदर्भ के लिए धन्यवाद, इससे मुझे बहुत मदद मिली। –

2
प्रयास करें

अपने एसक्यूएल बयान की शुरुआत करने के लिए अपने CTE परिभाषा ले जाएँ। कीवर्ड WITH एक या अधिक सीटीई पेश करने के लिए आपके कथन की शुरुआत में एक बार प्रकट होता है, जिसे बाद में निम्न SQL में संदर्भित किया जा सकता है। इस CTE example पर एक नज़र डालें, यह आपके लिए इसे साफ़ कर देगा।

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