मैं CTE क्वेरी का उपयोग करके तालिका से सभी माता-पिता और बच्चों की पंक्तियों को खोजने के लिए एक क्वेरी बनाने की कोशिश कर रहा हूं।

मैं या तो माता-पिता को खोज सकता हूं और बच्चों को वापस कर सकता हूं या बच्चों को खोज सकता हूं और माता-पिता को वापस कर सकता हूं लेकिन मैं एक क्वेरी में दोनों संभावनाओं को नहीं संभाल सकता।

मैं केवल सभी प्रश्नों में से एक को पूरा कर सकता हूं।

मुझसे कहां गलती हो रही है?

declare @search nvarchar(50)

--set @search = '%Nucleus sub project%';
set @search = '%Nucleus test';

WITH Parent AS
(
    SELECT * 
    FROM tblProjects 
    WHERE ProjNo LIKE @search 
       OR ProjDes LIKE @search

    UNION ALL

    SELECT tblProjects.* 
    FROM tblProjects  
    JOIN Parent ON tblProjects.proID = Parent.ParentProjID

    UNION ALL

    SELECT tblProjects.* 
    FROM tblProjects  
    JOIN Parent ON tblProjects.ParentProjID = Parent.proID 
)
SELECT distinct * 
FROM Parent 
ORDER BY ParentProjID

मुझे एक त्रुटि मिली:

बयान समाप्त हुआ। बयान पूरा होने से पहले अधिकतम पुनरावृत्ति 100 समाप्त हो गई है।

3
user1781272 2 पद 2015, 18:31

2 जवाब

सबसे बढ़िया उत्तर

दो अलग-अलग सीटीई का उपयोग करने का प्रयास करें:

WITH x AS (
    SELECT p.*
    FROM tblProjects p
    WHERE  ProjNo LIKE @search OR ProjDes LIKE @search
   ),
   parents as (
    SELECT * 
    FROM x 
    UNION ALL
    SELECT p.* 
    FROM parents JOIN
         tblProjects p
         ON p.parentid= parents.proID
   ),
   children as (
    SELECT * 
    FROM x 
    UNION ALL
    SELECT p.* 
    FROM children JOIN
         tblProjects p
         ON children.parentid = p.proID
   )
SELECT distinct * 
FROM parents
UNION
SELECT distinct *
FROM children;
3
Gordon Linoff 3 पद 2015, 00:48

यूनिअन ऑल के बाद दूसरा चयन रीसर्चली कहा जाता है जब तक कि परिणाम सेट में अधिक पंक्तियों को नहीं जोड़ा जाता है।

इसलिए;

  1. आपको तीसरे चयन कथन की आवश्यकता नहीं है। दूसरे को सब कुछ पकड़ना चाहिए।
  2. यदि आपके पास साइकिल है (उदाहरण के लिए, A का जनक B है; B का माता-पिता A है) तो आपको एक अनंत पुनरावृत्ति मिलेगी, और SQL 100 पुनरावृत्तियों के बाद छोड़ देगा, जिससे आपको अधिकतम पुनरावृत्ति त्रुटि होगी।

चक्रों का पता लगाना अधिक जटिल है, लेकिन किया जा सकता है।

2
Steve Cooper 2 पद 2015, 17:04