Завершение моей рекурсивной операции SQL, является ли cte хорошим выбором для меня?

У меня есть следующие данные:

TestData
Code | RowNum |
123  | 1      |
456  | 2      |
789  | 3      |

Я пытаюсь выполнить цикл по этим данным, проверяя отдельную таблицу, чтобы увидеть, являются ли какие-либо записи LIKE этими кодами. Вот что я пробовал, но в конце я возвращаю 0 записей. Я считаю, что мог бы использовать cte для достижения этой цели, но у меня возникли проблемы с пониманием базовой идеи рекурсивного cte. Я иду в неправильном направлении здесь? Ниже приведен запрос, который возвращает 0 записей.

DECLARE @myCounter int = 0;
WHILE (@myCounter < @ROWCOUNT)
BEGIN
    DECLARE @Code nvarchar(8) = (SELECT [Code]
                                 FROM [MyTable]
                                 WHERE [RowNum] = @myCounter);
    SELECT *
    FROM [RefTable]
    WHERE [Code] LIKE '%' + @Code + '%';
END

person Volearix    schedule 23.04.2015    source источник


Ответы (2)


Похоже, это нужно сделать с помощью одного запроса, используя LEFT JOIN:

SELECT m.RowNum, m.Code, COUNT(*) AS c
FROM MyTable m
LEFT JOIN RefTable r ON ( r.Code LIKE '%' + m.Code + '%' )
GROUP BY m.RowNum, m.Code
ORDER BY m.RowNum

Используйте JOIN вместо LEFT JOIN, чтобы игнорировать строки без записей вместо отображения 0.

person Peter Lang    schedule 23.04.2015

Не уверен, что это сильно поможет, но если вы пытаетесь сопоставить код с другой таблицей, вы всегда можете выполнить соединение с условием LIKE и потенциально избежать рекурсивного поиска.

SELECT * FROM T1
RIGHT JOIN T2
ON T1.CODE LIKE '%' + T2.CODE + '%'
person Jeffrey Eldredge    schedule 23.04.2015