sql - यकत - दोनों पूर्वजों/माता-पिता और बच्चों(डीबी 2/एसक्यूएलएसर्वर) के लिए एकल व्याकरण संबंधी प्रश्न




हिन्दी व्याकरण की परिभाषा (2)


मैंने ओरेकल के लिए समाधान का पता लगाया है जिसमें यूनिअस ऑर का इस्तेमाल किया गया है, जिसमें दो पदानुक्रमित कनेक्टिविटी, एक पूर्वजों को लाने और एक अन्य बच्चे हैं।
मैं दोनों DB2 और SQL सर्वर के लिए एक ही हासिल करना चाहता हूँ
मैं एक तत्व जानता हूं कि यह पदानुक्रम पर जड़, शाखा या पत्ती हो सकता है मुझे इसके पूरे पदानुक्रम को लाने की आवश्यकता है

मान लीजिए मेरे पास मद आईडी = 'मद 3' और वर्ग = 'मेरी कक्षा' है , मुझे अपने पूर्वजों और बच्चों को खोजने की आवश्यकता है, मैं इसके साथ आया हूं:

with ancestor (class, itemid, parent, base, depth)
as (
    select root.class, root.itemid, root.parent, root.itemid, 0
    from item root
    where root.class = 'myclass'
    and root.itemid = 'item3'
--      union all
--  select child.class, child.itemid, child.parent, root.base, root.depth+1
--  from ancestor root, item child
--  where child.class = root.class
--  and child.parent = root.itemid
        union all
    select parent.class, parent.itemid, parent.parent, parent.itemid, root.depth-1
    from ancestor root, item parent
    where parent.class = root.class
    and parent.itemid = root.parent
)
select distinct class, itemid, parent, base, depth
from ancestor 
order by class, base, depth asc, itemid

मुझे इस तरह का परिणाम चाहिए:

class      itemid     parent     base     depth
myclass     item1     null      item3        -2
myclass     item2     item1     item3        -1
myclass     item3     item2     item3        0
myclass     item4     item3     item3        1
myclass     item5     item5     item3        2

यदि उपर्युक्त एसक्यूएल चलाया जाता है तो मुझे पूर्वजों को ठीक मिल जाता है। अब अगर मैंने टिप्पणियों को हटा दिया है, तो यह अनंत लूप पर है। उस काम को बनाने का एक तरीका होना चाहिए
मैं पदानुक्रम में एक दिशा (पूर्वज या बच्चों) में परिणाम प्राप्त करने में सक्षम हूं, लेकिन मैं एक ही प्रश्न पर दोनों को प्राप्त करने में असमर्थ हूं।
क्या किसी ने कभी ऐसा कुछ करने की कोशिश की?

धन्यवाद

https://code.i-harness.com


टिप्पणी की गई क्वेरी में, आपको माता-पिता का उल्लेख करना होगा

कृपया इस http://msdn.microsoft.com/en-us/library/ms186243.aspx पर जाएं

USE AdventureWorks2008R2; GO WITH DirectReports (ManagerID, EmployeeID, Title, DeptID, Level) AS (
-- Anchor member definition
    SELECT e.ManagerID, e.EmployeeID, e.Title, edh.DepartmentID, 
        0 AS Level
    FROM dbo.MyEmployees AS e
    INNER JOIN HumanResources.EmployeeDepartmentHistory AS edh
        ON e.EmployeeID = edh.BusinessEntityID AND edh.EndDate IS NULL
    WHERE ManagerID IS NULL
    UNION ALL
-- Recursive member definition
    SELECT e.ManagerID, e.EmployeeID, e.Title, edh.DepartmentID,
        Level + 1
    FROM dbo.MyEmployees AS e
    INNER JOIN HumanResources.EmployeeDepartmentHistory AS edh
        ON e.EmployeeID = edh.BusinessEntityID AND edh.EndDate IS NULL
    INNER JOIN DirectReports AS d
        ON e.ManagerID = d.EmployeeID )
-- Statement that executes the CTE SELECT ManagerID, EmployeeID, Title, DeptID, Level FROM DirectReports INNER JOIN HumanResources.Department AS dp
    ON DirectReports.DeptID = dp.DepartmentID WHERE dp.GroupName = N'Sales and Marketing' OR Level = 0; GO

यदि आप दो बयान के WITH ऐसा करने पर मन नहीं लगाते हैं, तो आपके पूरे पदानुक्रम का पेड़ लौटाता है।

परीक्षण डेटा

DECLARE @item TABLE (
  class VARCHAR(32)
  , itemid VARCHAR(32)
  , parent VARCHAR(32)
)

INSERT INTO @item VALUES 
  ('myclass', 'item1', null)  
  , ('myclass', 'item2', 'item1')  
  , ('myclass', 'item3', 'item2')    
  , ('myclass', 'item4', 'item3')    
  , ('myclass', 'item5', 'item4')    

SQL कथन

;WITH children AS (
  SELECT  class
          , itemid
          , parent
          , base = itemid
          , depth = 0
  FROM    @item
  WHERE   class = 'myclass'
          AND itemid = 'item3'          
  UNION ALL
  SELECT  children.class
          , i.itemid
          , i.parent
          , children.base
          , children.depth + 1
  FROM    children
          INNER JOIN @item i ON i.parent = children.itemid
                                AND i.class = children.class
)
, parents AS (
  SELECT  *
  FROM    children
  WHERE   depth = 0
  UNION ALL
  SELECT  parents.class
          , i.itemid
          , i.parent
          , parents.base
          , parents.depth - 1
  FROM    parents
          INNER JOIN @item i ON i.itemid = parents.parent
                                AND i.class = parents.class                                  
)
SELECT  *
FROM    children
UNION 
SELECT  *
FROM    parents
ORDER BY depth




hierarchical