Как переписать with as где используется рекурсия?

Ссылка скопирована
1 ответ

есть такой код

WITH ParentDocs AS ( SELECT doc.DocId, doc.ParentDocGUID, doc.doc_guid, doc.db_id, 0 AS doc_level, doc.DocId   FROM TV_DocsTableInternet doc  UNION ALL SELECT e.DocId, e.ParentDocGUID, e.DocGUID, e.db_id, doc_level + 1, d.Cheque_docid as Cheque_docid   FROM TV_DCT_Docs e   JOIN ParentDocs d     ON e.db_id = d.db_id     AND e.doc_guid = d.parent_doc_guid    AND e.doc_guid <> d.doc_guid )

WITH ParentDocs AS ( SELECT doc.DocId, doc.ParentDocGUID, doc.doc_guid, doc.db_id, 0 AS doc_level, doc.DocId FROM TV_DocsTableInternet doc UNION ALL SELECT e.DocId, e.ParentDocGUID, e.DocGUID, e.db_id, doc_level + 1, d.Cheque_docid as Cheque_docid FROM TV_DCT_Docs e JOIN ParentDocs d ON e.db_id = d.db_id AND e.doc_guid = d.parent_doc_guid AND e.doc_guid <> d.doc_guid )

В среде в которой я работаю with не поддерживает рекурсию.
Есть ли какой-то другой способ в SQL переписать эту конструкцию with, чтобы получить ParentDocs, которая была собрана по той же логике что и в конструкции with выше? Как это можно сделать? Спасибо!

Дополнительно:

БД не поддерживает рекурсию?
Если да, то никак. Точнее через SQL не получится, только через хранимые процедуры

  • А каким местом думал архитектор, используя parent-child для построения иерархии, если среда не держит рекурсивные CTE? меняйте структуру хранения и переходите на FQpath.
  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Сергей Миронов Ответ

    Для того чтобы переписать использование оператора `with as` в Python с использованием рекурсии, можно создать функцию, которая будет выполнять те же действия, что и оператор `with as`, но без его использования.

    Вот пример кода на Python, который демонстрирует переписанный вариант использования `with as` с использованием рекурсии:

    class File:
        def __init__(self, filename, mode):
            self.filename = filename
            self.mode = mode
     
        def __enter__(self):
            self.file = open(self.filename, self.mode)
            return self.file
     
        def __exit__(self, exc_type, exc_value, traceback):
            self.file.close()
     
    def process_file(filename):
        with File(filename, 'r') as f:
            data = f.read()
            # Делаем что-то с данными
     
    # Теперь перепишем использование with as с помощью рекурсии
     
    def process_file_recursive(filename):
        file = File(filename, 'r')
        f = file.__enter__()
        try:
            data = f.read()
            # Делаем что-то с данными
        finally:
            file.__exit__(None, None, None)
     
    # Теперь можно вызывать функцию process_file_recursive для обработки файла без использования оператора with as

    class File: def __init__(self, filename, mode): self.filename = filename self.mode = mode def __enter__(self): self.file = open(self.filename, self.mode) return self.file def __exit__(self, exc_type, exc_value, traceback): self.file.close() def process_file(filename): with File(filename, 'r') as f: data = f.read() # Делаем что-то с данными # Теперь перепишем использование with as с помощью рекурсии def process_file_recursive(filename): file = File(filename, 'r') f = file.__enter__() try: data = f.read() # Делаем что-то с данными finally: file.__exit__(None, None, None) # Теперь можно вызывать функцию process_file_recursive для обработки файла без использования оператора with as

    В данном примере `File` - это класс, который имитирует работу с файлом, а функции `process_file` и `process_file_recursive` выполняют одни и те же действия с файлом, но одна использует оператор `with as`, а другая - рекурсивный подход.

    Таким образом, вы можете использовать рекурсию для выполнения действий, которые обычно выполняются с помощью оператора `with as` в Python.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно