2013-06-10 3 views
-2

Без рекурсивное CTE использовать как получить ниже ожидаемого результата ..без рекурсивного CTE использовать как получить ниже ожидаемого результата

DECLARE @temp TABLE 
(
     ParentCode VARCHAR (100) 
    , ChildCode VARCHAR(100) 
) 

INSERT INTO @temp 
SELECT '101', '102' UNION ALL 
SELECT '102', '101' UNION ALL 
SELECT '103', '104' UNION ALL 
SELECT '104', '103' UNION ALL 
SELECT '105', '106' UNION ALL 
SELECT '106', '105' 

SELECT * FROM @temp 

Выход:

ParentCode 
101 
103 
105 
+1

Почему рекурсивного CTE не приемлемо? Ответ на это может повлиять на то, какие другие ответы могут или не могут работать и/или быть приемлемыми для вас. –

+8

Пожалуйста, объясните логику ожидаемого результата. –

+2

Также укажите (через теги), какую систему баз данных (и версию) вы используете. Вероятно, я бы предпочел SQL Server. –

ответ

1

Попробуйте один -

Запрос:

DECLARE @temp TABLE 
(
     ParentCode VARCHAR (100) 
    , ChildCode VARCHAR(100) 
) 

INSERT INTO @temp 
SELECT '101', '102' UNION ALL 
SELECT '102', '101' UNION ALL 
SELECT '103', '104' UNION ALL 
SELECT '104', '103' UNION ALL 
SELECT '105', '106' UNION ALL 
SELECT '106', '105' 

;WITH cte AS 
(
    SELECT 
      ParentCode 
     , ChildCode 
     , rn = ROW_NUMBER() OVER (ORDER BY ParentCode, ChildCode) 
    FROM @temp 
)  
SELECT t.ParentCode 
FROM cte t 
WHERE EXISTS(
    SELECT 1 
    FROM cte t2 
    WHERE t.ParentCode = t2.ChildCode 
     AND t.rn < t2.rn 
) 

Выход:

ParentCode 
---------- 
101 
103 
105