Как я могу выполнить запрос внутри запроса и установить его в качестве условия для основного запроса

#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/

Я буду иметь приличие не копировать код здесь 🙂