Как я могу сделать запрос внутри запроса и установить его в качестве условия для основного запроса - PullRequest
1 голос
/ 20 октября 2011

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.И Sub Org Org2 это Org3 и Org4.и Org 5 является подчиненной Org of Org3

Я хочу отобразить все детали этих Org под родительским Org1 в моей сетке данных.Здесь я знаю только идентификатор Org1, поэтому запрос mysql похож на

Select OrgName from Org_table where ID= 20 and ParentID is 20;

Но этот запрос возвращает только Org1 и Org2, я должен вернуть Org3, Org4 и Org5 также потому, что он находится под Org1.Как мне это сделать.Должен ли я использовать какой-то цикл, если так, как это сделать.Я использую c # сделать это на моем сайте asp.net.

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

Я хочу сделать рекурсивный запрос

Ответы [ 3 ]

0 голосов
/ 20 октября 2011

Поскольку MySQL не поддерживает рекурсивные запросы / CTE, вам придется эмулировать это (что, скажем, не так просто).

Вот отличный учебник по этому вопросу:

http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/

Я буду порядочен, если не скопирую код здесь:)

0 голосов
/ 20 октября 2011

У меня нет 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

Не уверен, что синтаксис в операторе обновления полностью корректен для mysql .. возможно, придется немного подправить.

0 голосов
/ 20 октября 2011

Вы можете перебирать результаты и продолжать запрашивать следующие связанные записи.

Сначала вы запускаете

Select OrgName, Id from Org_table where ID= 20 and ParentID = 20

И затем для каждого результата, который имеет Id! = 20, выдолжен выполнить запрос еще раз.(Пример для Org2)

Select OrgName, Id from Org_table where ParentID = 21    

Вы можете сохранить результаты в списке и затем получить отличия.

...