Во-первых, давайте попробуем добавить несколько лучших практик. Укажите все ваши столбцы с соответствующим псевдонимом таблицы. Простое выполнение некоторых из них является непоследовательным, а непоследовательный стиль трудным для чтения и подвержен ошибкам.
Далее, вы (надеюсь) не поняли фактический запрос. Общие названия, такие как «tableA», мешают пониманию.
Далее - ваше первое выражение в регистре кажется очень подозрительным. У вас одна ветка возвращает tb.id, а другие возвращают то, что выглядит как дата (или datetime). К сожалению, вы можете использовать int для datetime. Может не иметь никакого смысла, и это не приведет к ошибке. Итак, имеет ли это смысл?
Далее - вы допустили общую ошибку с границами даты и времени. В зависимости от ваших данных вы никогда не узнаете этого. Но нет никаких оснований ожидать этого, и есть все основания написать свою логику, чтобы избежать какой-либо возможности. Тибор очень подробно обсуждает здесь . Укороченная версия - ваша верхняя граница всегда должна быть эксклюзивной, чтобы поддерживать все возможные значения времени для вашего типа данных. 23:59:59 будет игнорировать любые значения времени с ненулевыми миллисекундами. И используйте буквальный формат, который не зависит от языка или настроек соединения.
Далее вы добавляете путаницу. Вы назвали свои столбцы в объявлении cte, но в вашем коде также есть псевдонимы для некоторых (но не для всех - смотрите, см. Комментарий о согласованности) столбцов, которые значительно отличаются от фактического имени столбца для cte. 2-й столбец для cte - «enddate», запрос привязки использует псевдоним «ForecastDueDate»
Далее, у вас есть это: tb.statusDte = 5. Имя подразумевает дату; буквальное подразумевает что-то другое. У вас есть другие столбцы, которые заканчиваются на «Dte», которые, очевидно, даты, но не этот? Опасность, опасность!
Далее вы ссылаетесь на столбцы «a.closeClass» и «a.statusDate». Нет таблицы или псевдонима с именем "a".
Наконец, у вас есть:
WHERE enddate BETWEEN enddate AND '12/31/2020 11:59:59 PM'
Подумайте о том, что вы написали. Не всегда ли enddate между enddate и 31.12.2010 (если enddate <= это значение)? Я думаю, что это источник вашей проблемы. Вы не вычисляете и не настраиваете что-либо из якоря, поэтому повторяемая часть просто продолжает выбирать, выбирать и выбирать. Нет логики для завершения рекурсии. </p>
Следующий вопрос, очевидно, «сейчас, чтобы это исправить». Это невозможно сказать, не зная вашей схемы, что она представляет и вашей цели. Использование рекурсии здесь не очевидно.