PDA

Просмотр полной версии : Помогите с SQL запросом плииз!


Тарифы: МТС, Билайн, МегаФон
Выгодные непубличные тарифы МТС, Билайн, МегаФон, Безлимитный интернет ✅
Vinny
05-06-2012, 20:55
http://linkme.ufanet.ru/images/dddc9...00d9c678c8.jpg

Vinny
05-06-2012, 20:58
prt, ser поля по которым можно узнать какая группа к какой относится

ArturAD
05-06-2012, 21:02
select * from TOV ORDER BY prt

Vinny
05-06-2012, 21:04
не так все просто.. В этом случае выдет вот так:

Табачные изделие
Элитная группа сигарет
Хреновая группа сигарет
LM
Winston
Palament
Петр1
Prima

ArturAD
05-06-2012, 21:06
верно, не обратил внимание как нужно вывести

хнырг
05-06-2012, 21:07
а чо LM и Winston, это элитные сиги чтоле? незнал

ArturAD
05-06-2012, 21:08
и зачем дерево хранить в одной таблице? куда удобней будет хранить данные в 3 таблицах

Vinny
05-06-2012, 21:09
это для примера привел
Вот такая база.. Из-за одного запроса делить в таблицы не охота, там 100500 записей.. изначально так была.

ArturAD
05-06-2012, 21:13
вывести так как тебе надо, вряд ли получится. А как ты понимаешь какая строка к какому уровню дерева относится?

Vinny
05-06-2012, 21:19
Вот смотри, у "Табачные изделия" ser=2. Все записи, у которых prt=2 отностся в "Табачные изделия". Вот у "Элитная группа сигарет" prt=2, значит она относится "Табачные изделия" .

Сделать можно, был скрипт, но благополучно проёбан..

ArturAD
05-06-2012, 21:34
select *
from TOV
where prt = 2
selectdo
select *
from tov
where ser = prt
selectdo
// здесь куда тебе нужно сохранить данные
endselect
endselect

два вложенных запроса, возможно для выполнения 2 запроса (вложенного) придётся использовать алиас.
сперва находим записи которые относятся ко 2 уровню дерева(1 запрос), потом находим записи которые относятся к 3 уровню (2 запрос).

Vinny
05-06-2012, 21:41
Спасибо, попробую. Результат сохранятся не будет, запрос будет запущен в IBexpert и там же выводиться. Кстати, там уровней много, просто я в примере привел 3 уровня. Надо как то циклически сделать

Vinny
05-06-2012, 21:51
там табачные изделия, спиртоводочные, мясные изделия и все так же делятся на подгруппы.

ArturAD
05-06-2012, 21:52
вложенные запросы делай тогда в цикле, когда не найдёт подходящую запись значит последний уровень, а лучше точно узнать из скольки уровней состоит дерево

Vinny
05-06-2012, 21:56
а нельзя это сделать через groupby ?

xcv
05-06-2012, 22:19
под какой SQL то? используй рекурсию

Vinny
05-06-2012, 22:25
sql server 2003 кажись. А как рекурсию? Напишите код плиз, я сам пока не очень понимаю :(

xcv
05-06-2012, 22:27
sql server 2003 не существует. набей в гугле - SQL рекурсия. хотя бы http://habrahabr.ru/post/43955/

Vinny
05-06-2012, 23:05
нашел кажись пример http://www.infocity.com.ua/db/content/db077.phtml
но как его использовать под свою задачу?

Vinny
05-06-2012, 23:48
ребят, помогите!! Очень надо, кровь из носу до утра надо сделать :( хелпми

xcv
06-06-2012, 12:31
я ж тебе по русски сказал что делать

WITH
Rec (ser, prt, name, pathstr)
AS (
SELECT ser, prt, name, cast(ser as nvarchar(max)) FROM TOV WHERE prt=1
UNION ALL
SELECT TOV.ser, TOV.prt, TOV.name, Rec.pathstr + '_'+cast(TOV.ser as nvarchar(max)) FROM TOV INNER JOIN Rec ON Rec.ser = TOV.prt
)
SELECT * FROM Rec ORDER BY pathstr