CTE рекурсия бесконечный цикл

Это чистое решение для JavaScript без каких-либо библиотек или плагинов:

document.addEventListener('click', function (e) {
    if (hasClass(e.target, 'bu')) {
        // .bu clicked
        // Do your thing
    } else if (hasClass(e.target, 'test')) {
        // .test clicked
        // Do your other thing
    }
}, false);

, где hasClass -

function hasClass(elem, className) {
    return elem.className.split(' ').indexOf(className) > -1;
}

Live demo

Кредит относится к Dave и Sime Vidas

Использование более современных JS, hasClass может быть реализовано как:

function hasClass(elem, className) {
    return elem.classList.contains(className);
}

0
задан GeekDev 28 March 2019 в 00:31
поделиться

2 ответа

Если данные находятся в структуре, которая представляет собой иерархию между записями, является циклом, то рекурсия становится бесконечной, вызывая проблему в SQL. Вы увидите, что ресурсы, используемые процессом SQL, значительно увеличиваются. Если вы используете MAXRECURSION с значением, отличным от 0 (ноль позволяет SQL продолжать рекурсию без ограничения), вы сможете ограничить рекурсию. С данными, которые зацикливаются или ссылаются друг на друга, вы можете использовать параметр MAXRECURSION

0
ответ дан Eralper 28 March 2019 в 00:31
поделиться

Во-первых, давайте попробуем добавить несколько лучших практик. Укажите все ваши столбцы с соответствующим псевдонимом таблицы. Простое выполнение некоторых из них является непоследовательным, а непоследовательный стиль труден для чтения и подвержен ошибкам.

Далее, вы (надеюсь) не поняли фактический запрос. Общие названия, такие как «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 декабря 2010 (если enddate < = это значение)? Я думаю, что это источник вашей проблемы. Вы не вычисляете и не настраиваете что-либо из якоря, поэтому повторяемая часть просто продолжает выбирать, выбирать и выбирать. Нет логики, чтобы закончить рекурсию.

Следующий вопрос, очевидно, «сейчас, чтобы это исправить». Это невозможно сказать, не зная вашей схемы, что она представляет и вашей цели. Использование рекурсии здесь не очевидно.

0
ответ дан SMor 28 March 2019 в 00:31
поделиться