Форум Краматорська

  • 23 Травень 2024, 20:10:43
  • Ласкаво Просимо, Гість
Будь ласка увійдіть або зареєструйтесь.

Увійти

Новини:

Автор Тема: Есть ли знатоки SQL (T-SQL)?  (Прочитано 3216 раз)

0 Користувачів і 1 Гість дивляться цю тему.

10 Жовтень 2015, 19:10:00
Відповідь #15
Offline

Enakievo


Offline Enakievo

  • ****
  • Старожил
  • Повідомлень: 2858
  • Країна: so
  • Карма: +159/-3
  • Дякую
  • Сказав: 218
  • Отримав: 585
    • Чоловіча
    • Перегляд профілю
Итак, покурив BOL сделана попытка прорыва
Код: [Select]
with Rec (parentid, childid, name, level_,typ) As
(select t.idparent, t.id, t.namedse, 0, t.typ from sostav_test1 t where t.idparent = 1
 union all
 select t.idparent, t.id, t.namedse, Rec.level_+1,t.typ
 from sostav_test1 t inner join Rec on (t.idparent = Rec.childid))
select replicate(char(160), 2*level_) + name [Состав по иерархии],typ [Тип ДСЕ] from Re
Результат пока не очень.
Код: [Select]
Состав по иерархии Тип ДСЕ
Корневая сборка Сборочная единица
  Деталь корневой сборки Деталь
  Вторая деталь корневой сборки Деталь
  Подсборка 1 уровня Сборочная единица
  Вторая подсборка 1-го уровня Сборочная единица
    Деталь второй подсборки 1-го уровня Деталь
    Деталь подсборки 1 Деталь
    Подсборка 2-го уровня Сборочная единица
      Деталь подсборки второго уровня Деталь
      Подсборка третьего уровня Сборочная единица
        Деталь подсборки третьего уровня Деталь
Рабский ум создан таким образом, что не придает никакого значения событиям, если они не закреплены кровью.

Форум Краматорська

Re: Есть ли знатоки SQL (T-SQL)?
« Відповідь #15 : 10 Жовтень 2015, 19:10:00 »

11 Жовтень 2015, 16:52:51
Відповідь #16
Offline

Elemental


Offline Elemental

  • **
  • Завсегдатай
  • Повідомлень: 210
  • Карма: +5/-0
  • Дякую
  • Сказав: 69
  • Отримав: 20
    • Чоловіча
    • Перегляд профілю
Упрощу табличку ))

Enakievo, dmp прав  -у тебя мусорник из данных.
Давай-ка не будем "упрощать табличку", а немного расширим вводную информацию.
Контекст задачи? Ты работаешь с уже существующей базой или ты ее рисуешь сам?
Что тебе отдают вьюхи? какова точная структура таблиц, ну или вьюх, если у тебя нет прав на работу с таблицами?

Вообще иерархия такого типа - это стандартная задача. И большинство разработчиков закладывает в структуру базы что-то, что облегчит гемморой работы с ней и позволит повысить производительность при выборках. Чаще всего это IDRecord - собственно идентификатор записи, ParentID - ссылка на прямого родителя, MainParentID - ссылка на корень иерархии для быстрого выбора всех потомков, LevelNum - уровень вложенности текущей записи, NumInCurLevel - порядковый номер в текущей ветке,  так же может быть ID промежуточной иерархии - в данном случае это мог бы быть ID вложенной сборки. Иногда делают текстовое поле именно для сортировки в выборках и контролируют его триггерами. Вобщем вариантов - тыщщи их.
Имхо, по тем данным, которые ты показал, не получится красиво сделать выборку. Только обрабатывать хранимой процедурой, добавлять какой-то признак сортировки искусственно, и наполнять получившимися данными временную табличку, откуда затем выгребать и сортировать набор данных для клиента.

Поэтому еще раз - каков полный контекст задачи?



11 Жовтень 2015, 19:07:30
Відповідь #17
Offline

Enakievo


Offline Enakievo

  • ****
  • Старожил
  • Повідомлень: 2858
  • Країна: so
  • Карма: +159/-3
  • Дякую
  • Сказав: 218
  • Отримав: 585
    • Чоловіча
    • Перегляд профілю
Работаю с сущ. базой, менять структуру таблиц нельзя
Вьюшек всего три
Первая содержит связи - выборку по IdParent, IdChild,количество (связи количественные), тип связи (например "Состоит из", т.е. сборка состоит из деталей)
Вторая - Id объекта, его обозначение, тип (деталь, сборка...), дата создания
Третья - содержит атрибуты (имя атрибута, Id объекта, которому принадлежит атрибут, значение атрибута)
Цитувати
MainParentID - ссылка на корень иерархии для быстрого выбора всех потомков, LevelNum - уровень вложенности текущей записи, NumInCurLevel - порядковый номер в текущей ветке,  так же может быть ID промежуточной иерархии - в данном случае это мог бы быть ID вложенной сборки. Иногда делают текстовое поле именно для сортировки в выборках и контролируют его триггерами. Вобщем вариантов - тыщщи их.
Имхо, по тем данным, которые ты показал, не получится красиво сделать выборку. Только обрабатывать хранимой процедурой, добавлять какой-то признак сортировки искусственно, и наполнять получившимися данными временную табличку, откуда затем выгребать и сортировать набор данных для клиента.
Такого нет. И вряд ли может быть, хотя бы потому, что объект может иметь входимость в разные сборки.
Если бы эти данные имелись - то задача бы решена была давно.
Да мне хоть как, красиво или не красиво. Доступ на создание ХП имеется, если что.
Контекст задачи - получить таблицу с данными
Цитувати
Как бы хотелось:
Корневая сборка (ее idparent будет всегда 1)
Детали корневой сборки idparent=id корневой сборки
Подсборка первого уровня ее idparent = id корневой сборки
Детали подсборки первого уровня их idparent = id корневой сборки
Подсборка второго уровня
детали...
и т.д.
Вторая сборка 1-го уровня...
Рабский ум создан таким образом, что не придает никакого значения событиям, если они не закреплены кровью.

11 Жовтень 2015, 19:47:43
Відповідь #18
Offline

dmp


Offline dmp

  • ЮРИЙ_ТАМАРА_8_ИВАН_БОРИС_АНТОН
  • ****
  • Старожил
  • Повідомлень: 1511
  • Країна: ua
  • Карма: +45/-28
  • Дякую
  • Сказав: 111
  • Отримав: 96
    • Чоловіча
    • Перегляд профілю
Чувак, исходя из того, что ты исходными данными кормишь по чайной ложке (то у тебя новые вьюшки, то у тебя новые поля) - вот тебе и ответ с честно развернутой иерархией, все, что тут можно сделать запросом, под данным, которые ты тут выложил:

Код: [Select]
select
t2.id
, t2.idparent
, t2.namedse
, t2.typ
from _enakievo t1
join _enakievo t2
on t1.id = t2.idparent
order by t2.idparent, t2.typ
:D

Код: [Select]
4424 4422 Деталь корневой сборки Деталь
4487 4422 Вторая деталь корневой сборки Деталь
4423 4422 Подсборка 1 уровня Сборочная единица
4474 4422 Вторая подсборка 1-го уровня Сборочная единица
4425 4423 Деталь подсборки 1 Деталь
4431 4423 Подсборка 2-го уровня Сборочная единица
4432 4431 Деталь подсборки второго уровня Деталь
4481 4431 Подсборка третьего уровня Сборочная единица
4475 4474 Деталь второй подсборки 1-го уровня Деталь
4482 4481 Деталь подсборки третьего уровня Деталь

И имей ввиду, что задача визуализации данных один к одному - это совсем не задача SQL сервера, не стоит его насиловать.

И картинка совсем как-бы не соответствует тому, что ты запрашиваешь, глянь внимательно. А твой запрос с common table expressions, я так понял - ковноиндент не соответствует - поле level_ свое посмотри: там отступ - от корневого элемента наверняка.

Цитувати
Доступ на создание ХП имеется, если что.
Либо пиши тогда курсорами, либо давай все, что есть (в Management Studio тыц правой кнопкой на таблицу, Dependencies, и все значимые связи с данными в студию)

Или бэкап базы выкладывай, если ее вкурить не можешь  :D
Arbeit macht frei
--------------------
Каждая строка кода на C++ выглядит как боль программиста, напечатанная словами

13 Жовтень 2015, 06:49:18
Відповідь #19
Offline

Enakievo


Offline Enakievo

  • ****
  • Старожил
  • Повідомлень: 2858
  • Країна: so
  • Карма: +159/-3
  • Дякую
  • Сказав: 218
  • Отримав: 585
    • Чоловіча
    • Перегляд профілю
Все, вопрос решен. Разобрался с курсорами - верно, удобная штука.
Жизнь заставит - и на безрыбье раком станешь  :lol:
Спасибо, что приняли участие. Нормальное ТЗ - половина успеха.
Результат:
Код: [Select]
parentid childid name typ
1 4422 Корневая сборка Сборочная единица
4422 4424 Деталь корневой сборки Деталь
4422 4487 Вторая деталь корневой сборки Деталь
4422 4423 Подсборка 1 уровня Сборочная единица
4423 4425 Деталь подсборки 1 Деталь
4422 4474 Вторая подсборка 1-го уровня Сборочная единица
4474 4475 Деталь второй подсборки 1-го уровня Деталь
4423 4431 Подсборка 2-го уровня Сборочная единица
4431 4432 Деталь подсборки второго уровня Деталь
4431 4481 Подсборка третьего уровня Сборочная единица
4481 4482 Деталь подсборки третьего уровня Деталь
Цитувати
А твой запрос с common table expressions, я так понял - ковноиндент не соответствует - поле level_ свое посмотри: там отступ - от корневого элемента наверняка.
дзен-программист, ну что тебе не нравится? да, отступ от корневой сборки, и шо?
Рабский ум создан таким образом, что не придает никакого значения событиям, если они не закреплены кровью.

13 Жовтень 2015, 12:50:08
Відповідь #20
Offline

dmp


Offline dmp

  • ЮРИЙ_ТАМАРА_8_ИВАН_БОРИС_АНТОН
  • ****
  • Старожил
  • Повідомлень: 1511
  • Країна: ua
  • Карма: +45/-28
  • Дякую
  • Сказав: 111
  • Отримав: 96
    • Чоловіча
    • Перегляд профілю
а то, что ты делаешь ненужную денормализацию, целостность которой ничем не обеспечишь (можно, конечно, ее обеспечить триггером, но в этом случае будут две проблемы: целостность данных, и триггер  :D чуть в триггере ошибся - транзакция будет откатываться)
вот ты вставишь новую сущность внутрь иерархии - уровни нижеследующих сущностей будешь пересчитывать? та даже если отсчитывать уровень от парента - делать то-же самое, только данных перелопачивать меньше
Arbeit macht frei
--------------------
Каждая строка кода на C++ выглядит как боль программиста, напечатанная словами

13 Жовтень 2015, 13:09:27
Відповідь #21
Offline

Enakievo


Offline Enakievo

  • ****
  • Старожил
  • Повідомлень: 2858
  • Країна: so
  • Карма: +159/-3
  • Дякую
  • Сказав: 218
  • Отримав: 585
    • Чоловіча
    • Перегляд профілю
а то, что ты делаешь ненужную денормализацию, целостность которой ничем не обеспечишь (можно, конечно, ее обеспечить триггером, но в этом случае будут две проблемы: целостность данных, и триггер  :D чуть в триггере ошибся - транзакция будет откатываться)
вот ты вставишь новую сущность внутрь иерархии - уровни нижеследующих сущностей будешь пересчитывать? та даже если отсчитывать уровень от парента - делать то-же самое, только данных перелопачивать меньше
Да все равно. Время жизни той таблички... это ж бабл-гам скелет для отчета
Может в следующей жизни, например, я в листбокс захочу этот датасет втулить, к примеру, а он уже с готовыми смещениями, красиво, типо  :)
Рабский ум создан таким образом, что не придает никакого значения событиям, если они не закреплены кровью.

13 Жовтень 2015, 13:16:56
Відповідь #22
Offline

dmp


Offline dmp

  • ЮРИЙ_ТАМАРА_8_ИВАН_БОРИС_АНТОН
  • ****
  • Старожил
  • Повідомлень: 1511
  • Країна: ua
  • Карма: +45/-28
  • Дякую
  • Сказав: 111
  • Отримав: 96
    • Чоловіча
    • Перегляд профілю
Цитувати
Может в следующей жизни, например, я в листбокс захочу этот датасет втулить, к примеру, а он уже с готовыми смещениями, красиво, типо
У меня ощущение, будто ты недавно с ms access перешел на sql server )
Не листбокс, а treeview нужен, который умеет распахивать иерархию - я ж писал. Там вообще возиться не нужно - по id и idparent сам визуализирует распахивающуюся иерархию, и отступы сделает - четко, как ты картинку прикладывал
Arbeit macht frei
--------------------
Каждая строка кода на C++ выглядит как боль программиста, напечатанная словами

Ці користувачі сказали Вам ДЯКУЮ:


13 Жовтень 2015, 13:21:19
Відповідь #23
Offline

Enakievo


Offline Enakievo

  • ****
  • Старожил
  • Повідомлень: 2858
  • Країна: so
  • Карма: +159/-3
  • Дякую
  • Сказав: 218
  • Отримав: 585
    • Чоловіча
    • Перегляд профілю
Цитувати
а treeview нужен, который умеет распахивать иерархию - я ж писал.
Я ж и говорю - в следующей жизни. Когда стану программистом  :)
Рабский ум создан таким образом, что не придает никакого значения событиям, если они не закреплены кровью.

Форум Краматорська

Re: Есть ли знатоки SQL (T-SQL)?
« Відповідь #23 : 13 Жовтень 2015, 13:21:19 »