Как найти узлы дерева, у которых нет дочерних узлов - PullRequest
0 голосов
/ 12 декабря 2018

Firebird Db хранит записи счетов диаграмм в таблице:

CREATE TABLE CHARTACC 
 (
  ACCNTNUM       Char(8) NOT NULL, -- Account ID (Primary Key)
  ACCPARNT       Char(8),          -- Parent ID
  ACCCOUNT       Integer,          -- account count
  ACCORDER       Integer,          -- order of children in nodes  
  ACCTITLE       varchar(150),     
  ACDESCRP       varchar(4000),
  DTCREATE       timestamp         -- date and time of creation
  )

Я должен написать запрос, который выбирает из таблицы только последние узлы, узлы которых не имеют дочерних узлов (child2, child3,subchild1, subchild2, subchild3 и subchild4).

enter image description here

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Подход not in, предложенный Джерри, обычно работает довольно медленно в семействе Interbase / Firebird / Yaffil / RedDatabase, индексы не используются и т. Д.

То же самое относится и к другому возможному представлению Select X from T1 where NOT EXISTS ( select * from t2 where t2.a = t1.b) - он может превратитьсятоже очень медленно.

Я согласен, что эти запросы лучше отражают то, что хотел человек, и, следовательно, более читабельны, но, тем не менее, они не рекомендуются в Firebird.Я был сильно укушен в 1990-х, когда делал приложение, похожее на Herbalife, я выбрал этот тип запроса, заключенный в цикл, для ежемесячного подсчета снизу вверх - update ... where not exists ... - и каждая итерация масштабировалась как o (n ^ 2).) в Interbase 5.5.Конечно, с тех пор Firebird 3 проделал большой путь, но этот «прямой» подход все еще не рекомендуется.

Более традиционный для SQL и FB-дружественный способ выразить его, хотя и менее прямой и труднее для чтения,быть Select t1.x from t1 LEFT JOIN t2 on t1.a=t2.b WHERE t2.y IS NULL

0 голосов
/ 12 декабря 2018

Ваш запрос должен работать примерно так:

select * from CHARTACC where ACCNTNUM not in (select ACCPARNT from CHARTACC)

Чтобы поместить его в термины, выберите элементы из этой таблицы, где его идентификатор не найден в той же таблице нигде в его родительском поле.

...