Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 вывод дерева, удовлетворяющего условию  [new]
wweter
Member

Откуда: Севастополь
Сообщений: 34
mssql200 + php

стоит задача из таблицы, содержащей дерево каталога (как группы позиций, так и сами позиции) вывести все папки удовлетворяющие условиям (ismark=0 and sp3431=0 and isfolder=1). условие должно выполняться у родителя и только при этом рассматриваются ее дети. причем уровень вложения папок не постоянный (от 1 до 5), именно по-этому использую LEFT JOIN.

Таблица имеет структуру:

T=SC135 |Справочник Номенклатура |SC135 |R
#-----Fields-------
# Name |Descr |Type|Length|Precision
F=ID |ID object |C |9 |0
F=PARENTID |ID parent obj |C |9 |0
F=DESCR |object description |C |100 |0
F=ISFOLDER |Is Line - Folder |Y |0 |0
F=ISMARK |Object is Marked for|L |0 |0
F=SP3431 |(P)НеВыводить |N |1 |0


у меня не получилось организовать такую выборку, по-этому делаю следующим образом:

SELECT f1.descr, f2.descr, f3.descr, f4.descr, f5.descr
FROM SC135 f1                                                       
LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and  f2.isfolder=1
LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and  f3.isfolder=1
LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and  f4.isfolder=1
LEFT JOIN SC135 f5 ON f5.parentid = f4.id and f5.ismark=0 and f5.sp3431=0 and  f5.isfolder=1
WHERE f1.parentid='     0   ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0  
GROUP BY f1.descr, f2.descr, f3.descr, f4.descr, f5.descr
ORDER BY f1.descr, f2.descr, f3.descr, f4.descr, f5.descr  


результат выглядит следующим образом:
Компьютеры 	Готовые ПК 				
Компьютеры Комплектующие CD, CD-RW, DVD приводы
Компьютеры Комплектующие HDD Flash USB Drive
Компьютеры Комплектующие Аксессуары, запчасти, прочее
Компьютеры Комплектующие Акустические системы
Компьютеры Комплектующие Блоки питания (PSU)
Компьютеры Комплектующие Видеокарты ATI, NVIDIA, прочие AGP видеокарты
Компьютеры Комплектующие Видеокарты ATI, NVIDIA, прочие PCI-e видеокарты

хотелось бы на выходе увидеть

Компьютеры
Комплектующие
CD, CD-RW, DVD приводы
HDD Flash USB Drive
Аксессуары, запчасти, прочее
Акустические системы
Видеокарты ATI, NVIDIA, прочие
AGP видеокарты
PCI-e видеокарты


есть идеи?
30 сен 09, 18:13    [7726655]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
aleks2
Guest
SELECT COALESCE(NULLIF(f5.descr,''), NULLIF(f4.descr,''), NULLIF(f3.descr,''), NULLIF(f2.descr,''), NULLIF(f1.descr,''))
...
30 сен 09, 19:45    [7727037]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
wweter
Member

Откуда: Севастополь
Сообщений: 34
aleks2,

в таком случае мы теряем те папки, которые ни разу не были конечны, например

Компьютеры
Комплектующие
Видеокарты ATI, NVIDIA, прочие

те. запрос выводит все правые папки :(
30 сен 09, 19:52    [7727058]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
iljy
Member

Откуда:
Сообщений: 8711
wweter,

UNPIVOT + DISTINCT
1 окт 09, 00:30    [7727681]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
wweter
mssql200 + php
Вы указали странную версию СУБД. Какая версия на самом деле: 2000, 2005 или 2008 ? и еще: нельзя ли скрипт с данными, заполняющими эту таблицу ? например, не понятно, что означает
where f1.parentid='     0   '
1 окт 09, 01:40    [7727738]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
wweter
Member

Откуда: Севастополь
Сообщений: 34
Ozzy-Osbourne
wweter
mssql200 + php
Вы указали странную версию СУБД. Какая версия на самом деле: 2000, 2005 или 2008 ? и еще: нельзя ли скрипт с данными, заполняющими эту таблицу ? например, не понятно, что означает
where f1.parentid='     0   '


ошибся. ms sql 2000

f1.parentid=' 0 ' это признак самой старшей папки.

ниже код который в данный момент выполняет поставленную задачу.

$query =  " SELECT f5.descr, f5.code, f4.code ";
$query .= " FROM SC135 f1                                                       ";
$query .= " LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and  f2.isfolder=1";
$query .= " LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and  f3.isfolder=1";
$query .= " LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and  f4.isfolder=1";
$query .= " LEFT JOIN SC135 f5 ON f5.parentid = f4.id and f5.ismark=0 and f5.sp3431=0 and  f5.isfolder=1";    //     f5.isfolder=1
$query .= " WHERE f1.parentid='     0   ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0 and (f5.descr IS NOT NULL)  ";
$query .= " GROUP BY f5.descr, f5.code, f4.code";


$query .=  " UNION ";

$query .=  " SELECT f4.descr, f4.code, f3.code ";
$query .= " FROM SC135 f1                                                       ";
$query .= " LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and  f2.isfolder=1";
$query .= " LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and  f3.isfolder=1";
$query .= " LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and  f4.isfolder=1";
$query .= " LEFT JOIN SC135 f5 ON f5.parentid = f4.id and f5.ismark=0 and f5.sp3431=0 and  f5.isfolder=1";    
$query .= " WHERE f1.parentid='     0   ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0 and (f4.descr IS NOT NULL)  ";
$query .= " GROUP BY f4.descr, f4.code, f3.code";

$query .=  " UNION ";

$query .=  " SELECT f3.descr, f3.code, f2.code ";
$query .= " FROM SC135 f1                                                       ";
$query .= " LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and  f2.isfolder=1";
$query .= " LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and  f3.isfolder=1";
$query .= " LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and  f4.isfolder=1";
$query .= " LEFT JOIN SC135 f5 ON f5.parentid = f4.id and f5.ismark=0 and f5.sp3431=0 and  f5.isfolder=1";    
$query .= " WHERE f1.parentid='     0   ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0 and (f3.descr IS NOT NULL)  ";
$query .= " GROUP BY f3.descr, f3.code, f2.code";

$query .=  " UNION ";

$query .=  " SELECT f2.descr, f2.code, f1.code ";
$query .= " FROM SC135 f1                                                       ";
$query .= " LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and  f2.isfolder=1";
$query .= " LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and  f3.isfolder=1";
$query .= " LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and  f4.isfolder=1";
$query .= " LEFT JOIN SC135 f5 ON f5.parentid = f4.id and f5.ismark=0 and f5.sp3431=0 and  f5.isfolder=1";    
$query .= " WHERE f1.parentid='     0   ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0  and (f2.descr IS NOT NULL) ";
$query .= " GROUP BY f2.descr, f2.code, f1.code";

$query .=  " UNION ";

$query .=  " SELECT f1.descr, f1.code, 'root'";
$query .= " FROM SC135 f1                                                       ";
$query .= " LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and  f2.isfolder=1";
$query .= " LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and  f3.isfolder=1";
$query .= " LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and  f4.isfolder=1";
$query .= " LEFT JOIN SC135 f5 ON f5.parentid = f4.id and f5.ismark=0 and f5.sp3431=0 and  f5.isfolder=1";    
$query .= " WHERE f1.parentid='     0   ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0   ";
$query .= " GROUP BY f1.descr, f1.code, f1.parentid";
1 окт 09, 01:56    [7727747]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
wweter
Member

Откуда: Севастополь
Сообщений: 34
Ozzy-Osbourne,

скрипта заполнения, к сожалению, не будет тк это делает 1С v7.7
1 окт 09, 01:59    [7727749]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
TC
скрипта заполнения, к сожалению, не будет
ну, тогда скриншот вставьте, чтобы данные таблицы было видно в виде грида; если скрин будет больше 100К, сделайте его в виде .bmp и утрамбуйте в rar - он займёт гораздо меньше места, чем jpg
1 окт 09, 02:03    [7727751]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
aleks2
Guest
wweter
aleks2,

в таком случае мы теряем те папки, которые ни разу не были конечны, например

Компьютеры
Комплектующие
Видеокарты ATI, NVIDIA, прочие

те. запрос выводит все правые папки :(

Ну чо ты такой простой?

select descr
FROM
(
SELECT f1.descr
FROM SC135 f1                                                       
LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and  f2.isfolder=1
LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and  f3.isfolder=1
LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and  f4.isfolder=1
LEFT JOIN SC135 f5 ON f5.parentid = f4.id and f5.ismark=0 and f5.sp3431=0 and  f5.isfolder=1
WHERE f1.parentid='     0   ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0  
GROUP BY f1.descr, f2.descr, f3.descr, f4.descr, f5.descr
ORDER BY f1.descr, f2.descr, f3.descr, f4.descr, f5.descr  
UNION ALL
SELECT f2.descr
FROM SC135 f1                                                       
LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and  f2.isfolder=1
LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and  f3.isfolder=1
LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and  f4.isfolder=1
LEFT JOIN SC135 f5 ON f5.parentid = f4.id and f5.ismark=0 and f5.sp3431=0 and  f5.isfolder=1
WHERE f1.parentid='     0   ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0  
GROUP BY f1.descr, f2.descr, f3.descr, f4.descr, f5.descr
ORDER BY f1.descr, f2.descr, f3.descr, f4.descr, f5.descr  
UNION ALL
...
) X
GROUP BY descr

Ежели ты растолкуешь на основании чего туды не должно попадать "Готовые ПК" - сделаем и это...
1 окт 09, 07:16    [7727853]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
wweter
Member

Откуда: Севастополь
Сообщений: 34
aleks2

Ну чо ты такой простой?

select descr
FROM
(
SELECT f1.descr
FROM SC135 f1                                                       
LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and  f2.isfolder=1
LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and  f3.isfolder=1
LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and  f4.isfolder=1
LEFT JOIN SC135 f5 ON f5.parentid = f4.id and f5.ismark=0 and f5.sp3431=0 and  f5.isfolder=1
WHERE f1.parentid='     0   ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0  
GROUP BY f1.descr, f2.descr, f3.descr, f4.descr, f5.descr
ORDER BY f1.descr, f2.descr, f3.descr, f4.descr, f5.descr  
UNION ALL
SELECT f2.descr
FROM SC135 f1                                                       
LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and  f2.isfolder=1
LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and  f3.isfolder=1
LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and  f4.isfolder=1
LEFT JOIN SC135 f5 ON f5.parentid = f4.id and f5.ismark=0 and f5.sp3431=0 and  f5.isfolder=1
WHERE f1.parentid='     0   ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0  
GROUP BY f1.descr, f2.descr, f3.descr, f4.descr, f5.descr
ORDER BY f1.descr, f2.descr, f3.descr, f4.descr, f5.descr  
UNION ALL
...
) X
GROUP BY descr

Ежели ты растолкуешь на основании чего туды не должно попадать "Готовые ПК" - сделаем и это...


Ваш запрос с union аналогичен тому, который я показал выше.

а вот в этом:
SELECT COALESCE(NULLIF(f5.descr,''), NULLIF(f4.descr,''), NULLIF(f3.descr,''), NULLIF(f2.descr,''), NULLIF(f1.descr,''))

будут только крайние правые папки.
1 окт 09, 08:53    [7727934]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
Leierkastenmann
Member

Откуда: Москва
Сообщений: 113
wweter,

А хотите именно одним запросом? Есть еще всевозможные варианты с временными таблицами.
Просто опыт работы с иерархическими справочниками 1с показывает, что одним запросом вывести какие-то подобные вещи на крупных справочниках очень накладно. Или производительность непринципиальна?

И второй вопрос - не очень понятно, как должна следовать в результате иерархия следующей группы верхнего уровня? А то в вашем примере группа верхнего уровня только одна.
1 окт 09, 09:11    [7727969]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
wweter
Member

Откуда: Севастополь
Сообщений: 34
Leierkastenmann
wweter,

А хотите именно одним запросом? Есть еще всевозможные варианты с временными таблицами.
Просто опыт работы с иерархическими справочниками 1с показывает, что одним запросом вывести какие-то подобные вещи на крупных справочниках очень накладно. Или производительность непринципиальна?


мой запрос выполняется 0.429 сек , что для меня приемлемо, если есть что-то, что ускорит его - внедрю с удовольствием.

Leierkastenmann

И второй вопрос - не очень понятно, как должна следовать в результате иерархия следующей группы верхнего уровня? А то в вашем примере группа верхнего уровня только одна.


примерно так

Компьютеры 	Готовые ПК 				
Компьютеры Комплектующие CD, CD-RW, DVD приводы
Компьютеры Комплектующие HDD Flash USB Drive
Компьютеры Комплектующие Аксессуары, запчасти, прочее
Компьютеры Комплектующие Акустические системы
Компьютеры Комплектующие Блоки питания (PSU)
Компьютеры Комплектующие Видеокарты ATI, NVIDIA, прочие AGP видеокарты
Компьютеры Комплектующие Видеокарты ATI, NVIDIA, прочие PCI-e видеокарты
Реклама В лифтах
Реклама В газетах Издательство 1
Реклама В газетах Издательство 2
Реклама В газетах Издательство 3
1 окт 09, 09:25    [7728024]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
vino
Member

Откуда:
Сообщений: 1191
wweter, расчитывать на быструю оптимизацию можно, если бы был скрипт с демо-данными...
1 окт 09, 10:32    [7728289]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
vino
Member

Откуда:
Сообщений: 1191
wweter
...Таблица имеет структуру:

T=SC135 |Справочник Номенклатура |SC135 |R
#-----Fields-------
# Name |Descr |Type|Length|Precision
F=ID |ID object |C |9 |0
F=PARENTID |ID parent obj |C |9 |0
F=DESCR |object description |C |100 |0
F=ISFOLDER |Is Line - Folder |Y |0 |0
F=ISMARK |Object is Marked for|L |0 |0
F=SP3431 |(P)НеВыводить |N |1 |0
...
есть идеи?

может быть, там есть еще и поле, указывающее уровень вложенности?
тогда выборку можно упростить
1 окт 09, 11:02    [7728455]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
wweter
Member

Откуда: Севастополь
Сообщений: 34
vino,

нет, в таблице предусмотрена только связь по родителю, уровень вложения отсутствует.

добавил интересующий запрос в основной, почему-то не выводятся аррегированные поля, подскажите пожалуйста в чем может быть проблема. агрегированные поля выделил жирным

php

$query = " SELECT t.code as code, t.descr as tovar, ed.descr as edname, ";

$query .= " (SELECT sum(rg273.sp276) FROM rg273 WHERE sp274=t.id and period=convert(datetime,'$date') and rg273.sp276>0)/ed.sp210 as rez, ";
$query .= " (SELECT sum(rg123.sp127) FROM rg123, sc129 WHERE rg123.sp125=t.id and rg123.sp124=' 0' and period=convert(datetime,'$date') and rg123.sp126=sc129.id and sc129.sp4992=1 and sc129.ismark=0)/ed.sp210 as kvo, ";
$query .= " t.SP5245 as price0, t.sp7046 as price1, t.sp5244 as price2, t.sp7047 as price3 ";
$query .= " FROM sc135 t, SC135 parent, SC207 ed ";
$query .= " WHERE ";

$query .= " t.parentid=parent.id and t.ismark=0 and t.sp3431=0 and ed.id=t.sp145";
$query .= " and parent.code IN ( ";

$query .= " SELECT f5.code ";
$query .= " FROM SC135 f1 ";
$query .= " LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and f2.isfolder=1";
$query .= " LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and f3.isfolder=1";
$query .= " LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and f4.isfolder=1";
$query .= " LEFT JOIN SC135 f5 ON f5.parentid = f4.id and f5.ismark=0 and f5.sp3431=0 and f5.isfolder=1";
$query .= " WHERE f1.parentid=' 0 ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0 and (f5.descr IS NOT NULL) ";
$query .= " GROUP BY f5.descr, f5.code, f4.code";

$query .= " UNION ";

$query .= " SELECT f4.code ";
$query .= " FROM SC135 f1 ";
$query .= " LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and f2.isfolder=1";
$query .= " LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and f3.isfolder=1";
$query .= " LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and f4.isfolder=1";
$query .= " LEFT JOIN SC135 f5 ON f5.parentid = f4.id and f5.ismark=0 and f5.sp3431=0 and f5.isfolder=1";
$query .= " WHERE f1.parentid=' 0 ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0 and (f4.descr IS NOT NULL) ";
$query .= " GROUP BY f4.descr, f4.code, f3.code";

$query .= " UNION ";

$query .= " SELECT f3.code ";
$query .= " FROM SC135 f1 ";
$query .= " LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and f2.isfolder=1";
$query .= " LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and f3.isfolder=1";
$query .= " LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and f4.isfolder=1";
$query .= " LEFT JOIN SC135 f5 ON f5.parentid = f4.id and f5.ismark=0 and f5.sp3431=0 and f5.isfolder=1";
$query .= " WHERE f1.parentid=' 0 ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0 and (f3.descr IS NOT NULL) ";
$query .= " GROUP BY f3.descr, f3.code, f2.code";

$query .= " UNION ";

$query .= " SELECT f2.code ";
$query .= " FROM SC135 f1 ";
$query .= " LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and f2.isfolder=1";
$query .= " LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and f3.isfolder=1";
$query .= " LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and f4.isfolder=1";
$query .= " LEFT JOIN SC135 f5 ON f5.parentid = f4.id and f5.ismark=0 and f5.sp3431=0 and f5.isfolder=1";
$query .= " WHERE f1.parentid=' 0 ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0 and (f2.descr IS NOT NULL) ";
$query .= " GROUP BY f2.descr, f2.code, f1.code";

$query .= " UNION ";

$query .= " SELECT f1.code ";
$query .= " FROM SC135 f1 ";
$query .= " LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and f2.isfolder=1";
$query .= " LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and f3.isfolder=1";
$query .= " LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and f4.isfolder=1";
$query .= " LEFT JOIN SC135 f5 ON f5.parentid = f4.id and f5.ismark=0 and f5.sp3431=0 and f5.isfolder=1";
$query .= " WHERE f1.parentid=' 0 ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0 ";
$query .= " GROUP BY f1.descr, f1.code, f1.parentid";

$query .= " ) ";

$query .= " GROUP BY t.descr, t.code, t.id, t.SP5245, t.SP7046, t.SP5244, t.SP7047, ed.descr, ed.sp210 ";
$query .= " ORDER BY t.descr ";
1 окт 09, 11:29    [7728600]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
vino
Member

Откуда:
Сообщений: 1191
wweter
...почему-то не выводятся аррегированные поля, подскажите пожалуйста в чем может быть проблема...
какую-то ошибку пишет? или пустое значение?
по поводу скорости вывода - советую протестить все-таки варианты для 2000 Помогите с запросом.]отсюда[/url]
1 окт 09, 11:40    [7728674]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
wweter
Member

Откуда: Севастополь
Сообщений: 34
vino
какую-то ошибку пишет? или пустое значение?
по поводу скорости вывода - советую протестить все-таки варианты для 2000 Помогите с запросом.]отсюда[/url]


ошибок никаких не выдает, как будто выводит null .

1 2 3 4 5 6 7 8 9
OS10807 µ[mju:] 600/800/500 Accessory Kit шт. 50 0 50 0
OS24392 04G266006022 Блок питания ADAPTOR 90W 3PIN шт. 74 0 74 0
OS13987 04GNA53KRUS4 Клавиатура KEYBOARD A3N (RUS) R5.0/SUNREX шт. 45.05 0 38.83 0
OS17071 07G0166B3450 батарея SBP-09 Maxell Hard-Pack ICP653450AR/3.7V 1200mAH для кпк асус шт. 109 0 150 0
OS22338 10port: D-Link DGS-3200-10 10-Port Managed L2 Gigabit Switch шт. 265 0 222.6 0
OS27186 12port: ZyXEL 12xSFPGigabit shared 4xRJ-45 шт. 1213 0 1018.5 0
OS26117 12port: ZyXEL 12xSFPGigabit shared 4xRJ-45 L2+ шт. 976 0 819.84 0
OS29238 15" Acer AL1517As шт. 106.4 97.9 98.8 97.9
1 окт 09, 11:55    [7728792]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
wweter
Member

Откуда: Севастополь
Сообщений: 34
интересующие стобцы 4 и 5
1 окт 09, 11:56    [7728803]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
vino
Member

Откуда:
Сообщений: 1191
Кстати, почему вы не упростили этот код
wweter

...
$query .= " SELECT f5.code ";
$query .= " FROM SC135 f1 ";
$query .= " LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and f2.isfolder=1";
$query .= " LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and f3.isfolder=1";
$query .= " LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and f4.isfolder=1";
$query .= " LEFT JOIN SC135 f5 ON f5.parentid = f4.id and f5.ismark=0 and f5.sp3431=0 and f5.isfolder=1";
$query .= " WHERE f1.parentid=' 0 ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0 and (f5.descr IS NOT NULL) ";
$query .= " GROUP BY f5.descr, f5.code, f4.code";

$query .= " UNION ";

$query .= " SELECT f4.code ";
$query .= " FROM SC135 f1 ";
$query .= " LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and f2.isfolder=1";
$query .= " LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and f3.isfolder=1";
$query .= " LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and f4.isfolder=1";
$query .= " LEFT JOIN SC135 f5 ON f5.parentid = f4.id and f5.ismark=0 and f5.sp3431=0 and f5.isfolder=1";
$query .= " WHERE f1.parentid=' 0 ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0 and (f4.descr IS NOT NULL) ";
$query .= " GROUP BY f4.descr, f4.code, f3.code";

$query .= " UNION ";

$query .= " SELECT f3.code ";
$query .= " FROM SC135 f1 ";
$query .= " LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and f2.isfolder=1";
$query .= " LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and f3.isfolder=1";
$query .= " LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and f4.isfolder=1";
$query .= " LEFT JOIN SC135 f5 ON f5.parentid = f4.id and f5.ismark=0 and f5.sp3431=0 and f5.isfolder=1";
$query .= " WHERE f1.parentid=' 0 ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0 and (f3.descr IS NOT NULL) ";
$query .= " GROUP BY f3.descr, f3.code, f2.code";

$query .= " UNION ";

$query .= " SELECT f2.code ";
$query .= " FROM SC135 f1 ";
$query .= " LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and f2.isfolder=1";
$query .= " LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and f3.isfolder=1";
$query .= " LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and f4.isfolder=1";
$query .= " LEFT JOIN SC135 f5 ON f5.parentid = f4.id and f5.ismark=0 and f5.sp3431=0 and f5.isfolder=1";
$query .= " WHERE f1.parentid=' 0 ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0 and (f2.descr IS NOT NULL) ";
$query .= " GROUP BY f2.descr, f2.code, f1.code";

$query .= " UNION ";

$query .= " SELECT f1.code ";
$query .= " FROM SC135 f1 ";
$query .= " LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and f2.isfolder=1";
$query .= " LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and f3.isfolder=1";
$query .= " LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and f4.isfolder=1";
$query .= " LEFT JOIN SC135 f5 ON f5.parentid = f4.id and f5.ismark=0 and f5.sp3431=0 and f5.isfolder=1";
$query .= " WHERE f1.parentid=' 0 ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0 ";
$query .= " GROUP BY f1.descr, f1.code, f1.parentid";
...

из него вполне можно получить код немного короче, да и, возможно, побыстрее
...
$query .=  " SELECT f5.code ";
$query .= " FROM SC135 f1                                                       ";
$query .= " LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and  f2.isfolder=1";
$query .= " LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and  f3.isfolder=1";
$query .= " LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and  f4.isfolder=1";
$query .= " LEFT JOIN SC135 f5 ON f5.parentid = f4.id and f5.ismark=0 and f5.sp3431=0 and  f5.isfolder=1";   
$query .= " WHERE f1.parentid='     0   ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0 and (f5.descr IS NOT NULL)  ";
$query .= " GROUP BY f5.descr, f5.code, f4.code";

$query .=  " UNION ";

$query .=  " SELECT f4.code ";
$query .= " FROM SC135 f1                                                       ";
$query .= " LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and  f2.isfolder=1";
$query .= " LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and  f3.isfolder=1";
$query .= " LEFT JOIN SC135 f4 ON f4.parentid = f3.id and f4.ismark=0 and f4.sp3431=0 and  f4.isfolder=1";
$query .= " WHERE f1.parentid='     0   ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0 and (f4.descr IS NOT NULL)  ";
$query .= " GROUP BY f4.descr, f4.code, f3.code";

$query .=  " UNION ";

$query .=  " SELECT f3.code ";
$query .= " FROM SC135 f1                                                       ";
$query .= " LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and  f2.isfolder=1";
$query .= " LEFT JOIN SC135 f3 ON f3.parentid = f2.id and f3.ismark=0 and f3.sp3431=0 and  f3.isfolder=1";
$query .= " WHERE f1.parentid='     0   ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0 and (f3.descr IS NOT NULL)  ";
$query .= " GROUP BY f3.descr, f3.code, f2.code";

$query .=  " UNION ";

$query .=  " SELECT f2.code ";
$query .= " FROM SC135 f1                                                       ";
$query .= " LEFT JOIN SC135 f2 ON f2.parentid = f1.id and f2.ismark=0 and f2.sp3431=0 and  f2.isfolder=1";
$query .= " WHERE f1.parentid='     0   ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0  and (f2.descr IS NOT NULL) ";
$query .= " GROUP BY f2.descr, f2.code, f1.code";

$query .=  " UNION ";

$query .=  " SELECT f1.code ";
$query .= " FROM SC135 f1                                                       ";
$query .= " WHERE f1.parentid='     0   ' and f1.isfolder=1 and f1.ismark=0 and f1.sp3431=0   ";
$query .= " GROUP BY f1.descr, f1.code, f1.parentid";
...
1 окт 09, 11:59    [7728825]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
wweter
Member

Откуда: Севастополь
Сообщений: 34
vino
Кстати, почему вы не упростили этот код
из него вполне можно получить код немного короче, да и, возможно, побыстрее

большое спасибо, обязательно исправлю
1 окт 09, 12:01    [7728849]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
vino
Member

Откуда:
Сообщений: 1191
wweter, попробуйте проверку на null
$query .= " (SELECT sum(COALESCE(rg273.sp276,0)) FROM rg273 WHERE sp274=t.id and period=convert(datetime,'$date') and rg273.sp276>0)/ed.sp210 as rez, ";
$query .= " (SELECT sum(COALESCE(rg123.sp127,0)) FROM rg123, sc129 WHERE rg123.sp125=t.id and rg123.sp124=' 0' and period=convert(datetime,'$date') and rg123.sp126=sc129.id and sc129.sp4992=1 and sc129.ismark=0)/ed.sp210 as kvo, ";
, но если не поможет, то пробуйте проверить корректность связи - посмотреть с вот таким кодом
$query .= " (SELECT count(*) FROM rg273 WHERE sp274=t.id and period=convert(datetime,'$date') and rg273.sp276>0)/ed.sp210 as rez, ";
$query .= " (SELECT count(*) FROM rg123, sc129 WHERE rg123.sp125=t.id and rg123.sp124=' 0' and period=convert(datetime,'$date') and rg123.sp126=sc129.id and sc129.sp4992=1 and sc129.ismark=0)/ed.sp210 as kvo, ";
1 окт 09, 12:08    [7728898]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
wweter,

попробуйте так:
declare @t table (id char(10) not null unique,parentid char(10) not null,descr varchar(100) not null,isfolder tinyint default 1,ismark tinyint default 0,sp tinyint default 0)
----- test data -----
insert into @t(id,parentid,descr) values( 1,0,'Комплектующие')
insert into @t(id,parentid,descr) values( 2,0,'Готовые ПК')
insert into @t(id,parentid,descr) values( 3,1,'CD, CD-RW, DVD приводы')
insert into @t(id,parentid,descr) values( 4,1,'HDD Flash USB Drive')
insert into @t(id,parentid,descr) values( 5,1,'Аксессуары, запчасти, прочее ')
insert into @t(id,parentid,descr) values( 6,1,'Акустические системы')
insert into @t(id,parentid,descr) values( 7,1,'Блоки питания (PSU)')
insert into @t(id,parentid,descr) values( 8,1,'Видеокарты ATI, NVIDIA, прочие')
insert into @t(id,parentid,descr) values( 9,8,'AGP видеокарты')
insert into @t(id,parentid,descr) values(10,8,'PCI видеокарты')
insert into @t(id,parentid,descr) values(11,9,'AGP video с охлаждением')
insert into @t(id,parentid,descr) values(12,9,'AGP video без охлаждения')
insert into @t(id,parentid,descr) values(13,11,'AGP с воздушным охлаждением')
insert into @t(id,parentid,descr) values(14,11,'AGP с водяным охлаждением')

insert into @t(id,parentid,descr) values(17, 7,'БП низковольтные')
insert into @t(id,parentid,descr) values(18, 7,'БП высоковольтные')
insert into @t(id,parentid,descr) values(19,18,'БП 220V')
insert into @t(id,parentid,descr) values(20,18,'БП 380V')
insert into @t(id,parentid,descr) values(21,20,'БП 380V отечественный с адаптером на 220В')
insert into @t(id,parentid,descr) values(22,20,'БП 380V отечественный без адаптера на 200В')

insert into @t(id,parentid,descr) values(23,10,'Adapter PCI-X1')
insert into @t(id,parentid,descr) values(24,10,'Adapter PCI-X2')
insert into @t(id,parentid,descr) values(25,10,'AAAAAAA PCI-X3')

insert into @t(id,parentid,descr) values(26,19,'BLOCK-220V-AC China')
insert into @t(id,parentid,descr) values(27,20,'BLOCK-380V-DC Singapore')
insert into @t(id,parentid,descr) values(28,20,'BLOCK-380V-DC Philippines')
insert into @t(id,parentid,descr) values(29,17,'SmartBlock 15V China')

insert into @t(id,parentid,descr) values(30,7,'б/у')
insert into @t(id,parentid,descr) values(31,4,'б/у')
insert into @t(id,parentid,descr) values(32,3,'б/у')

insert into @t(id,parentid,descr) values(33,2,'б/у')
insert into @t(id,parentid,descr) values(34,33,'ПК 486')
insert into @t(id,parentid,descr) values(35,33,'ПК 386')
insert into @t(id,parentid,descr) values(36,2,'Пентиум')
insert into @t(id,parentid,descr) values(37,2,'Моторола')
insert into @t(id,parentid,descr) values(38,11,'АГП-адаптеры с фреонным охлаждением')

----- query -----
select nm
from
    (
    select distinct 
           nm=case n.i when 1 then d1 when 2 then space(2)+d2 when 3 then space(4)+d3 when 4 then space(6)+d4 else space(8)+d5 end
          ,id=case n.i when 1 then id1 when 2 then id2 when 3 then id3 when 4 then id4 else id5 end
    from 
        (
              select 
                    id1=f1.id,id2=f2.id,id3=f3.id,id4=f4.id,id5=f5.id
                   ,d1=f1.descr, d2=f2.descr, d3=f3.descr, d4=f4.descr, d5=f5.descr
              from @t f1                                                       
                   left join @t f2 on f2.parentid = f1.id and f2.ismark=0 and f2.sp=0 and  f2.isfolder=1
                   left join @t f3 on f3.parentid = f2.id and f3.ismark=0 and f3.sp=0 and  f3.isfolder=1
                   left join @t f4 on f4.parentid = f3.id and f4.ismark=0 and f4.sp=0 and  f4.isfolder=1
                   left join @t f5 on f5.parentid = f4.id and f5.ismark=0 and f5.sp=0 and  f5.isfolder=1
              where f1.parentid=0 and f1.isfolder=1 and f1.ismark=0 and f1.sp=0  
              group by 
                    f1.id, f2.id, f3.id, f4.id, f5.id
                   ,f1.descr, f2.descr, f3.descr, f4.descr, f5.descr
            ) t
            join (select i=1 union all select 2 union all select 3 union all select 4 union all select 5)n on 1=1
    )z
    left join 
    (
        select 
              id1=f1.id,id2=f2.id,id3=f3.id,id4=f4.id,id5=f5.id
             ,d1=f1.descr, d2=f2.descr, d3=f3.descr, d4=f4.descr, d5=f5.descr
        from @t f1                                                       
             left join @t f2 on f2.parentid = f1.id and f2.ismark=0 and f2.sp=0 and  f2.isfolder=1
             left join @t f3 on f3.parentid = f2.id and f3.ismark=0 and f3.sp=0 and  f3.isfolder=1
             left join @t f4 on f4.parentid = f3.id and f4.ismark=0 and f4.sp=0 and  f4.isfolder=1
             left join @t f5 on f5.parentid = f4.id and f5.ismark=0 and f5.sp=0 and  f5.isfolder=1
        where f1.parentid=0 and f1.isfolder=1 and f1.ismark=0 and f1.sp=0  
        group by 
              f1.id, f2.id, f3.id, f4.id, f5.id
             ,f1.descr, f2.descr, f3.descr, f4.descr, f5.descr
    ) t
    on z.id in (id5,id4,id3,id2,id1)
group by nm,id
having nm>''
order by min(case z.id when id5 then d1+d2+d3+d4 when id4 then d1+d2+d3 when id3 then d1+d2 when id2 then d1 else '' end+ltrim(z.nm))
Result:
Готовые ПК
  б/у
    ПК 386
    ПК 486
  Моторола
  Пентиум
Комплектующие
  CD, CD-RW, DVD приводы
    б/у
  HDD Flash USB Drive
    б/у
  Аксессуары, запчасти, прочее 
  Акустические системы
  Блоки питания (PSU)
    б/у
    БП высоковольтные
      БП 220V
        BLOCK-220V-AC China
      БП 380V
        BLOCK-380V-DC Philippines
        BLOCK-380V-DC Singapore
        БП 380V отечественный без адаптера на 200В
        БП 380V отечественный с адаптером на 220В
    БП низковольтные
      SmartBlock 15V China
  Видеокарты ATI, NVIDIA, прочие
    AGP видеокарты
      AGP video без охлаждения
      AGP video с охлаждением
        AGP с водяным охлаждением
        AGP с воздушным охлаждением
        АГП-адаптеры с фреонным охлаждением
    PCI видеокарты
      AAAAAAA PCI-X3
      Adapter PCI-X1
      Adapter PCI-X2
1 окт 09, 12:15    [7728956]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
wweter
Member

Откуда: Севастополь
Сообщений: 34
vino
wweter, попробуйте проверку на null
$query .= " (SELECT sum(COALESCE(rg273.sp276,0)) FROM rg273 WHERE sp274=t.id and period=convert(datetime,'$date') and rg273.sp276>0)/ed.sp210 as rez, ";
$query .= " (SELECT sum(COALESCE(rg123.sp127,0)) FROM rg123, sc129 WHERE rg123.sp125=t.id and rg123.sp124=' 0' and period=convert(datetime,'$date') and rg123.sp126=sc129.id and sc129.sp4992=1 and sc129.ismark=0)/ed.sp210 as kvo, ";


результат тот же, нулей в 4 и 5 нет.

vino
, но если не поможет, то пробуйте проверить корректность связи - посмотреть с вот таким кодом
$query .= " (SELECT count(*) FROM rg273 WHERE sp274=t.id and period=convert(datetime,'$date') and rg273.sp276>0)/ed.sp210 as rez, ";
$query .= " (SELECT count(*) FROM rg123, sc129 WHERE rg123.sp125=t.id and rg123.sp124=' 0' and period=convert(datetime,'$date') and rg123.sp126=sc129.id and sc129.sp4992=1 and sc129.ismark=0)/ed.sp210 as kvo, ";


а при count выдает значение 0.

как бы грешить приходится на эти 2 селекта, но без проверки принадлежности папки товара к интересующим меня все проходит на ура. грубо говоря если убрать
and parent.code IN ( SELECT f5.code FROM SC135 f1   
... 
UNION 
все работает хорошо
1 окт 09, 12:20    [7728991]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
wweter
Member

Откуда: Севастополь
Сообщений: 34
Ozzy-Osbourne,

насколько я понимаю Вы говорите только о папках товара, с этим вопросом мы более или менее разобрались, появилась другая проблема - перестали считать агрегатные функции.
1 окт 09, 12:22    [7729011]     Ответить | Цитировать Сообщить модератору
 Re: вывод дерева, удовлетворяющего условию  [new]
vino
Member

Откуда:
Сообщений: 1191
wweter
...если есть что-то, что ускорит его - внедрю с удовольствием...
один из быстрых вариантов для 2000 - это цикл, похожий на CTE, например, с помощью двух JOIN
declare @m table(ID varchar(9), DESCR varchar(100))
INSERT @m -- выбор корней
SELECT ID, descr
FROM SC135 WHERE parentid='     0   ' and isfolder=1 and ismark=0 and sp3431=0  
WHILE @@ROWCOUNT > 0 -- выбор потомков
	INSERT @m
	SELECT f.ID, f.descr
	FROM (SC135 f LEFT JOIN @m e ON f.ID = e.ID)
	INNER JOIN @m s ON f.parentid = s.ID and  f.isfolder=1 and f.ismark=0 and f.sp3431=0
	WHERE e.ID is null
		
SELECT ID, DESCR FROM @m
в вашем случае выборку @m можно применить для фильтрации по ID, для этого достаточно такого кода
declare @m table(ID varchar(9))
INSERT @m -- выбор корней
SELECT ID
FROM SC135 WHERE parentid='     0   ' and isfolder=1 and ismark=0 and sp3431=0  
WHILE @@ROWCOUNT > 0 -- выбор потомков
	INSERT @m
	SELECT f.ID
	FROM (SC135 f LEFT JOIN @m e ON f.ID = e.ID)
	INNER JOIN @m s ON f.parentid = s.ID and  f.isfolder=1 and f.ismark=0 and f.sp3431=0
	WHERE e.ID is null
		
SELECT s.ID, s.DESCR FROM @m f INNER JOIN SC135 s ON f.ID = s.ID
а если таблица SC135 не меняется в момент выборки или фантомы не страшны, то добавьте опцию грязного чтения with(nolock) для существенного ускорения выборки (это, кстати, и в ваш код можно воткнуть)
declare @m table(ID varchar(9))
INSERT @m -- выбор корней
SELECT ID
FROM SC135 with(nolock) WHERE parentid='     0   ' and isfolder=1 and ismark=0 and sp3431=0  
WHILE @@ROWCOUNT > 0 -- выбор потомков
	INSERT @m
	SELECT f.ID
	FROM (SC135 with(nolock) f LEFT JOIN @m e ON f.ID = e.ID)
	INNER JOIN @m s ON f.parentid = s.ID and  f.isfolder=1 and f.ismark=0 and f.sp3431=0
	WHERE e.ID is null
		
SELECT s.ID, s.DESCR FROM @m f INNER JOIN SC135 s with(nolock) ON f.ID = s.ID
1 окт 09, 12:35    [7729099]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить