У меня есть сценарий, подобный следующему:
create table #Example (
id int
, overall_id int
, parent_id int
, child_id int
);
insert into #Example values
(1, 25963, 491575090, 491575090)
,(2, 25963, 547952026, 491575090)
,(3, 25963, 547952026, 230085039)
,(4, 25963, 547952026, 547952026);
select e.*
from #Example as e;
drop table #Example;
Я хочу исключить запись с идентификатором "2", потому что это ее собственная родительская запись (см. идентификатор "1").
Я не хочу исключать 3, потому что дочерняя запись не является родительской. И я не хочу исключать 1 и 4, потому что это их собственные родительские записи.
Одна проблема заключается в том, что в моем бизнес-сценарии у меня нет соответствующего поля «ID», которое я предоставил в этом примере, чтобы я мог однозначно ссылаться на каждую строку.
Любая помощь в методах исключения записи 2 будет принята с благодарностью!
Я бы предположил, @squillman, «альтернативный» метод для обозначения корневого узла. Хотя почему вместо этого не используется NULL
, я не уверен. Хранение идентификатора ребенка и родителя в одной строке кажется плохим решением. Сохраните либо дочерний, либо родительский, а не оба. Обычно вы храните родителя в иерархии, так как у родителя может быть много дочерних элементов, но у дочернего элемента только один родитель.
Да, я обычно использую NULL или -1 или что-то подобное для обозначения верхнего уровня.
Правильно, @Larnu. Наша фактическая таблица хранит это в иерархии. Я просил это конкретное представление в отдельном вопросе: stackoverflow.com/questions/71119720/…. То, что мне нужно (что выходит за рамки этого вопроса), показывает некоторые атрибуты дочернего уровня данного родителя, которые в нашем случае включают самого «родителя». Дело в том, что я знаю, что это не лучшая практика «хранения» узла верхнего уровня, это то, что я делаю сейчас.
Я не очень понимаю поля. Кажется, что overall_id
отделяет это дерево от других деревьев, чтобы они были независимыми? Но и у 1, и у 4 есть child_id = parent_id
? Каково значение этого?
У каждого parent_id есть один или несколько дочерних_id, включая как минимум самого себя. Это делается для того, чтобы связать другие элементы в системе с «идентификатором родителя», который может включать элементы из самого родителя. Я не знаю, отвечает ли это на ваш вопрос, но приведенные выше комментарии также отражают значение child_id = parent_id.
Чтобы уточнить немного больше, подумайте об этом как о зонтике с «родительским идентификатором», являющимся концом зонтика. Каждое ребро зонтика похоже на дочерний идентификатор и содержит информацию «под ним», которую я хочу связать с конечным верхом (родительским идентификатором). Проблема в том, что с данными, с которыми я имею дело, сам конец вершины (родительский) имеет информацию, которую я хочу видеть, как если бы она была связана с родителем как дочерний элемент (вне этого контекста я присоединяюсь к другой таблице по дочернему идентификатору чтобы получить всю информацию/детали для каждого "ребра").
Я все еще не понимаю вопроса, но ожидаемый результат выпадает из:
select *
from #Example as E
where not exists (
select 42
from #Example as IE
where
-- There is a row that is self parenting?!
IE.parent_id = IE.child_id and
-- The row under consideration is related in a child/parent way?
IE.child_id = E.child_id and
-- It isn't the same row as we're considering.
IE.id <> E.id );
См. dbfiddle.
Спасибо, я знаю, что это сбивает с толку... но я ценю, что вы показали мне способ решения насущной проблемы!
И, конечно же, я ценю 42, ха-ха
Вопрос: почему что-то может быть своим собственным родителем?