Strannik223 wrote:После этого мы поговорим насколько то что получилось естественно.
CONNECT BY PRIOR START WITH ?
Strannik223 wrote:3. Евгений, я замечаю что у вас все очень легко, как два байта переслать. В качестве упражнения попробуйте сделать структуру таблицы и выборку всех подчиненных для Начальник/Подчиненный, только не упрощайте пожалуйста, а помните что у кождого начальника есть начальник над ним, и таким образом каждый сотрудник может быть и начальником и подчиненным.
После этого мы поговорим насколько то что получилось естественно.
Strannik223 wrote:3. Евгений, я замечаю что у вас все очень легко, как два байта переслать. В качестве упражнения попробуйте сделать структуру таблицы и выборку всех подчиненных для Начальник/Подчиненный, только не упрощайте пожалуйста, а помните что у кождого начальника есть начальник над ним, и таким образом каждый сотрудник может быть и начальником и подчиненным.
После этого мы поговорим насколько то что получилось естественно.
Sergey___K wrote:CREATE TABLE all_the_people (id int4,level0 int4,level1 int4,level2 int4,....,levelN int4,name varchar 32) ,
- Василий Иванович, давай другую таблицу, в этой поля кончились
- Врешь, не возьмешь ...
f_evgeny wrote:Разместить-то легко, а вот достать не очень, поскольку информация "деревянная". Но этого-то как раз я и не обещал. Точнее, методов реляционной алгебры не хватает, придется обходить деревья в циклах.
А разместить - пожалуйста.
f_evgeny wrote:
while(!all_done) {
foreach $boss (@bosses) {
@subordinates=(SELECT id WHERE boss_id=$boss);
if(is_emty(@subordinates)) {
$all_done = 1;
}
@level_subordinates =
}
Получается сложно как раз потому, что информация "деревянная". Для таблиц как правило хватает реляционной алгебры.
oMoses wrote:future-DB и future-SQL после 2100 года:
1. Базы данных, как механизм организации, хранения и обработки информации всегда были есть и будут.
2. Раз всегда будут future-DB, то всегда будет и средства общения с ними - future-SQL.
3. Объемы данных future-DB будут колоссальными (однако это мало скажется на их физических размерах, поскольку человечество всегда будет стремиться к предельно возможному).
4. Существенно меняться будет лишь форма, организация и интерфейсы общения с данными. На смену реляционной модели прийдет что-то качественно иное, возможно связанное с выходом за рамки ныне известных нам измерений.
5. Принципиально новые виды информации и прогресс в области интерфейсов повлекут и самые серьезные изменения в методах работы с данными. От ныне живущей (2004 г.) редакции SQL не останется и следа, но сам по себе язык общения с future-DB останется востребованным.
Seryi wrote:Я читал про деревья в SQL, помимо стандартного рекурсивного решения которое представил Евгений есть еще методы Celko и Tropashko
Уже точно не помню в чем заключались, но смысл в том что селекты по дереву были очень недорогими операциями.
С другой стороны инсерты и апдейты были чрезвычайно дорогими. Фактически приходилось перелопачивать полдерева при инсерте.
Sergey___K wrote:CREATE TABLE all_the_people (id int4,level0 int4,level1 int4,level2 int4,....,levelN int4,name varchar 32) ,
- Василий Иванович, давай другую таблицу, в этой поля кончились
- Врешь, не возьмешь ...
Strannik223 wrote:f_evgeny wrote:Разместить-то легко, а вот достать не очень, поскольку информация "деревянная". Но этого-то как раз я и не обещал. Точнее, методов реляционной алгебры не хватает, придется обходить деревья в циклах.
А разместить - пожалуйста.
Усложним задачку что бы вам совсем жарко стало.
Выбрать только тех сотрудников у которых есть подчиненный (на любом уровне) у которого имя "Вася", и начальника (не обязательно непосредственного) зовут "Петя"
И это не надуманый пример, задача реальная.
И это должно работать бысторо, очень бысторо, и даже еще быстрее!
Code: Select all
SELECT xCol.query('/doc[@id = 123]//section')
FROM docs
WHERE xCol.exist ('/doc[@id = 123]') = 1
или
SELECT pk, xCol.query('
for $s in /doc[@id = 123]//section
where $s/@num >= 3
return <topic>{data($s/heading)}</topic>')
FROM docs
Sergey___K wrote:А тем временем:
http://msdn.microsoft.com/XML/BuildingXML/XMLandDatabase/default.aspx?pull=/library/en-us/dnsql90/html/sql2k5xml.aspCode: Select all
SELECT xCol.query('/doc[@id = 123]//section')
FROM docs
WHERE xCol.exist ('/doc[@id = 123]') = 1
или
SELECT pk, xCol.query('
for $s in /doc[@id = 123]//section
where $s/@num >= 3
return <topic>{data($s/heading)}</topic>')
FROM docs
Code: Select all
where myTable.myXmlField/some/xpath/here = 'kukuruza' ?