Проблема SQL-запроса в таблице с самообращающимся родительским идентификатором - PullRequest
0 голосов
/ 11 января 2011

Первая подходящая схема:

A - таблица записей списка с ListID, Date и ItemID

B представляет собой таблицу базовых элементов с идентификатором и владельцем (в настоящее время это текст).

C - таблица владельцев с ID (int), Name (varchar) и Parent (int). Родитель - это либо идентификатор другого члена, либо значение NULL, если это узел верхнего уровня. Эта таблица имеет только два уровня глубины, поэтому каждый член является либо дочерним, либо родительским.

A.ItemID указывает на B.ID B. Владелец указывает на C.Name C.Parent является нулевым или указывает на другой C.ID

Теперь проблема ...

Мне нужно посчитать количество записей в данном списке (ListID и Date) для каждого родителя в C. У меня это почти с одной проблемой. Запрос:

select C.owner, COUNT(B.ID) as Count from A  
join B on A.ItemID = B.ID  
join C on B.Owner= C.Owner  
join C2 on C.Parent = C2.ID   
Where date = '2011-01-10' and ListID = 1  
Group by C2.Owner  
order by C2.Owner  

Но это только подсчет записей, которые совпадают с дочерними строками в C. Поскольку родительские строки не имеют своих собственных идентификаторов в родительском поле, они не включаются в совокупные подсчеты, даже если есть элементы, которые непосредственно принадлежат родителям из таблицы C. Я вполне уверен, что смогу решить эту проблему, поместив эти значения, но это выглядит как плохой дизайн, поскольку эти строки фактически будут их родителями.

Есть ли способ управлять этим запросом, чтобы учесть это? Я в тупике.

В качестве альтернативы, нормально ли, чтобы строки ссылались на себя как на родителя с целью объединения их собственных данных с данными их детей?

Спасибо за любые советы здесь. Если это неясно, я могу быть более конкретным, но я пытаюсь скрыть от него несвязанную информацию.

1024 * Дан *

1 Ответ

0 голосов
/ 11 января 2011

Вам нужно использовать левое соединение на C и C2.

C LEFT JOIN C2 ON C.Parent = C2.ID

Это приведет к тому, что все строки будут включены из C, и, если в C2 есть соответствующий дочерний элемент, он также будет включен.

...