#c# #mysql #sql #inner-join
#c# #mysql #sql #внутреннее соединение
Вопрос:
Org_table:
OrgName Id ParentID
Org1 20 Null
Org2 21 20
Org3 22 21
Org4 23 21
Org5 24 22
Org6 25 Null
В приведенной выше таблице Org1 — это суперорганизация, а Org2 — дочерний элемент Org1. И подорганизацией Org2 являются Org3 и Org4. а Org 5 является подорганизацией Org3
Я хочу отобразить все сведения об этих организациях в родительском Org1 в моей таблице данных. Здесь я знаю только идентификатор Org1, поэтому запрос mysql выглядит так
Select OrgName from Org_table where ID= 20 and ParentID is 20;
Но этот запрос возвращает только Org1 и Org2, я должен вернуть Org3, Org4 и Org5 также потому, что он находится под Org1. Как я могу это сделать. должен ли я использовать какой-то цикл, если да, то как это сделать. Я использую c #, чтобы сделать это в моем asp.net веб-сайт.
Во время выполнения я не буду знать, какая организация является дочерней для какой организации. ИТАК, я должен найти, находится ли родительский идентификатор в основной организации
Я хочу выполнить рекурсивный запрос
Комментарии:
1. Можете ли вы указать, как вы хотите это показать??? потому что в сетке вам нужно только заменить родительский идентификатор на имя организации.
2. Я хочу отобразить все название организации, я не хочу отображать идентификатор. Для родительского Org1 я хочу отобразить все его дочерние элементы
Ответ №1:
У меня нет mysql под рукой, но это должно сделать то, что вам нужно
CREATE TEMPORARY TABLE TempTable (OrgName VARCHAR(10), Id INT, ParentID INT);
INSERT INTO TempTable SELECT OrgName, Id, ParentID FROM org_table;
WHILE EXISTS (SELECT TOP 1 1 FROM TempTable WHERE EXISTS(SELECT TOP 1 1 FROM TempTable TempTableParent WHERE TempTableParent.ID = TempTable.ParentID AND TempTableParent.ParentID IS NOT NULL) ) DO
UPDATE TempTable SET ParentID = TempTableParent .parentID
FROM TempTable
INNER JOIN TempTable TempTableParent ON TempTableParent.id = TempTable.ParentID
WHERE TempTable.ParentID IS NOT NULL AND TempTableParent.ParentID IS NOT NULL
END WHILE;
SELECT * FROM TempTable
Не уверен, что синтаксис инструкции update полностью корректен для mysql .. возможно, потребуется немного изменить.
Ответ №2:
Вы можете выполнять итерации по результатам и продолжать запрашивать следующие связанные записи.
Сначала вы запускаете
Select OrgName, Id from Org_table where ID= 20 and ParentID = 20
И затем для каждого результата, имеющего идентификатор != из 20, вы должны снова запустить запрос.
(Пример для Org2)
Select OrgName, Id from Org_table where ParentID = 21
Вы можете сохранить результаты в списке, а затем получить различия.
Комментарии:
1. Да, я просто пишу то же самое, но вы меня преодолеваете.
2. Похоже ли это на рекурсивный запрос и как я могу сохранить результат в БД, я думал сначала получить весь идентификатор организации, а затем выполнить запрос для отображения его в сетке
3. @Mark вы можете вставить частичные результаты во временную таблицу
Ответ №3:
Поскольку MySQL не поддерживает рекурсивные запросы / CTE, вам придется эмулировать это (что, скажем, непросто).
Вот отличный учебник по этому вопросу:
http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/
Я буду иметь приличие не копировать код здесь 🙂