Можно ли заменить курсор в SQL, когда запрос является иерархическим? - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть три таблицы в MsSQL для хранения данных.

Во-первых, Дети содержат следующие строки ID, Имя, Возраст, FatherID, SchoolID

Второй содержит данные об их отцах, такие как FatherID, Имя, Возраст

Третий - Школа с SchoolID и SchoolName, Address и т. Д.

(Соотношение: у нескольких детей может быть один и тот же отец, очевидно :))

Я хочу перечислить всех членов семьи, связанных с данным SchoolID.

Я знаю решение на основе курсора:

* Курсор работает с двумя временными таблицами, на первом этапеотбор детей с заданным школьным образованием во временную таблицу (@tempfamilymembers).

Второй шаг - выбрать из этой таблицы отдельные жирные короли и сохранить их во второй временной таблице (@fatherids).

Затем я бы перебрал эти толстые животные, чтобы вставить отцов с соответствующими толстыми птицами.(из @fatherids) в первую временную таблицу (@tempfamilymembers).

Затем я могу выбрать все из @tempfamilymembers для завершения запроса *

Решение на основе курсора слишком сложно, иОтносительно медленный плюс, я слышал, пока циклы показывают лучшую производительность, а подход, основанный на множестве, был бы еще лучше.

Мой вопрос: могу ли я достичь этого каким-либо образом, не создавая курсор? (Я хочу перечислить отцов, присутствующих в этом списке, только один раз, даже если у него более одного ребенка.)

1 Ответ

0 голосов
/ 18 февраля 2019
WITH family_members (id, name, age, role) AS
(
  SELECT FatherID, Name, Age, 'father'
  FROM Fathers 
  WHERE FatherID IN(SELECT DISTINCT FatherID
                    FROM Children 
                    WHERE SchoolID = 1) -- 1) Put School to search here
  UNION ALL
  SELECT ID, Name, Age, 'child '
  FROM Children
  WHERE SchoolID = 1 -- 2) Put School to search here
)
SELECT * FROM family_members
  • Если вы поместите некоторые данные в rextester , вы можете проверить это.Дайте мне знать, что вы думаете.

  • Если столбцы имеют разные типы (Дети против Отца), вам может потребоваться CAST столбцов.

  • Как я уже упоминал в комментариях CTE s / UNION ALL - это путь.; -)

...