Как создать цикл или способ использовать результаты предыдущих операторов SELECT в следующем операторе SELECT?

У меня есть база данных с вложенной иерархической структурой. На верхних уровнях иерархии нет фактических идентификаторы типов (отдельных элементов), связанных с данным marketGroupID.

Вместо этого я начинаю сверху, используя строковый поиск, чтобы найти нужные категории. Мне нужно продолжать спускаться по иерархии, используя идентификаторы групп рынка, который я выбрал в качестве идентификаторы родительской группы для следующего поиска, чтобы найти все идентификаторы в этой подкатегории. Это продолжает делиться на большее количество подкатегорий, пока столбец hasTypes = 1 (с этой подкатегорией связаны идентификаторы типов).

Хотя в настоящее время я использую очень ручной вариант: продолжайте выполнять еще один поиск, пока не доберусь до нужного уровня, есть ли способ построить цикл, который будет продолжать ВЫБОР на основе WHERE marketGroupID X = parentGroupID Y и hasTypes = 0?

РУЧНОЙ МЕТОД Я ПЫТАЮСЬ ЗАМЕНИТЬ

Столбцы, с которыми я в основном работаю, — это marketGroupID и parentID. До сих пор я пробовал использовать c.fetchall(), чтобы получить предыдущий результат и поместить его в переменную next_input. Затем я использую параметр '?' используя sqlite3 в Python. Проблема в том, что количество входных данных может измениться, так как предыдущий оператор SELECT даст мне список кортежей, который может быть от шестидесяти до нескольких сотен.

c.execute("""SELECT marketGroupID FROM invMarketGroups WHERE parentGroupID IN (SELECT marketGroupID FROM invMarketGroups WHERE marketGroupName='Ships' 
OR marketGroupName = 'Ship Equipment' OR marketGroupName = 'Implants & Boosters')""");

Следующий шаг поиска.

python next_input = c.fetchall()

Итак, потратив время на то, чтобы их количество было равно длине списка, мне удалось заставить его работать, превратив результат в один список:

next_input = [i[0] for i in next_input]

c.execute("SELECT marketGroupID FROM invMarketGroups WHERE parentGroupID IN ({idlist_formatted})".format(idlist_formatted= ','.join(['?']*len(next_input))), next_input)

Как сделать цикл, чтобы он продолжал рекурсивно работать до тех пор, пока hasTypes != 0 не захватит идентификаторы marketGroupID, где hasTypes = 1?

С WITH. Найдите рекурсивные CTE.

Shawn 29.05.2019 04:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Sqllite поддерживает рекурсивные запросы, которые можно использовать для иерархических запросов (это то, что вы пытаетесь сделать). Взгляните на документацию здесь В нем даже есть раздел об иерархических запросах. Таким образом, вы можете полностью заменить свой цикл одним вызовом БД и позволить ему выполнять свою работу.

Другие вопросы по теме