Загадка выбора sql: удалить детей, когда родитель отфильтрован - PullRequest
0 голосов
/ 25 февраля 2011

У меня есть таблица по существу:

name         has_children      parent_id    row_id values0.....valuesn
parent       1                 1            1
children     0                 1            2
children     0                 1            3
parent       0                 4            4
parent       1                 5            5
children     0                 5            6
children     0                 5            7

значения для детей могут отличаться от значений для родителя. Я хочу, чтобы некоторые операции выбора / объединения фильтровали таблицу по столбцу значений (т. е.> 10) и возвращали родителя (даже если для фильтра задано значение false), если один из его дочерних элементов истинен для фильтра.

acceptable return:
parent=true    all children=false, return just parent
parent=false   >=1 children=true, return parent and all non-filtered child

Я уверен, что раньше об этом думали, но у меня нет ни малейшего представления, как сформулировать вопрос, чтобы найти решение.

Ответы [ 2 ]

2 голосов
/ 25 февраля 2011

Соответствует ANSI. Каждая конкретная СУБД может иметь более быструю реализацию

select *
from tbl
where id in-- PARENTS of CHILDREN that match
(   select parent_id from tbl
    where values0 > 10 and has_children = 0)
or id in   -- ONE CHILD ONLY
(   select MIN(id) from tbl
    where values0 > 10 and has_children = 0
    group by parent_id)
or id in   -- PARENTS
(   select id from tbl
    where values0 > 10 and has_children = 1)

Лучше написано как JOIN

select t.*
from 
(   select parent_id as ID from tbl
    where values0 > 10 and has_children = 0
    UNION
    select MIN(id) from tbl
    where values0 > 10 and has_children = 0
    group by parent_id
    UNION
    select id from tbl
    where values0 > 10 and has_children = 1) X
join tbl t on X.ID = t.ID
0 голосов
/ 25 февраля 2011

Вероятно, проще всего разобраться с этим, как с двумя отдельными запросами с UNION между ними.

  1. Выберите родителя, для которого все дети ложны при условии.
  2. Выберите родителя и ребенка (возможно, MAX или MIN - самый простой).
...