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

Откуда: Краснодар
Сообщений: 55
Текущая выборка данных приведена на изображении.
В ней сгруппированы свойства товара. Свойства зависят друг от друга.

Например:
Марка: Id = 10 "Toyota" - родительское
Год выпуска: Id = 155 "2006" - дочернее от Toyota
Модель: Id = 351 "Camry" - зависит от 2006 и от Toyota
Вид крепления: Id=698 "На гладкую крышу" - зависит от Camry, 2006 и Toyota

Мне из этих данных нужно получить следующую выборку:
ValueId | ParentValueId
155 | 10
351 | 155
351 | 10
698 | 351
698 | 155
698 | 10

Пожалуйста, помогите решить проблему.

К сообщению приложен файл. Размер - 134Kb
23 дек 16, 18:03    [20042829]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом на выборку, пожалуйста  [new]
Artprog
Member

Откуда: Краснодар
Сообщений: 55
Текущий запрос:
SELECT imp.GroupNumber, imp.Article, imp.PropertyId, p.ParentPropertyId, 
	imp.PropertyValue, imp2.PropertyValueId AS ParentPropertyValueId
FROM [Catalog].[ImportFilters] imp
JOIN [Catalog].[Property] p ON p.PropertyID = imp.PropertyId
LEFT JOIN [Catalog].[ImportFilters] imp2 ON imp2.PropertyId = p.ParentPropertyId 
	AND imp2.GroupNumber = imp.GroupNumber
ORDER BY imp.GroupNumber, p.SortOrder
23 дек 16, 18:04    [20042832]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом на выборку, пожалуйста  [new]
Artprog
Member

Откуда: Краснодар
Сообщений: 55
Artprog,

Все так сложно или просто не интересная задача?
Или я не понятно описал вопрос?
26 дек 16, 09:42    [20047653]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом на выборку, пожалуйста  [new]
КусокАналитика
Guest
https://www.sql.ru/forum/127456/rekomendacii-po-oformleniu-soobshheniy-v-forume

Выполнение пунктов 4 и 6, обычно сильно сокращают время ожидания ответа.
26 дек 16, 09:58    [20047715]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом на выборку, пожалуйста  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
Artprog
Или я не понятно описал вопрос?
Непонятно, как связаны данные, и что нужно получить.
26 дек 16, 10:43    [20047871]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом на выборку, пожалуйста  [new]
MSSQLAndDotNet
Member

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

Я так понял Вам просто обход дерева надо сделать
Вот пример обхода снизу вверх для орг структуры
Сверху вниз аналогично для своей задачи переделайте


+
	;WITH Rec(org_id, org_name,  org_parent_org_id, [order]) AS
	(
		SELECT org_id, o.org_name, org_parent_org_id, 0 AS [order]
		FROM Orgs AS o
		WHERE o.org_id = 'c1efaaa7-9a7e-11e6-9e3b-18a90550aa54'
		
		UNION ALL 
		
		SELECT o.org_id, o.org_name, o.org_parent_org_id, (r.[order] + 1) AS [order]
		FROM Orgs AS o
			INNER JOIN Rec AS r ON r.org_parent_org_id = o.org_id		
	)
	
	SELECT r.org_id, ROW_NUMBER() OVER (ORDER BY r.[order] DESC) AS rn
	FROM Rec AS r		
	ORDER BY r.[order] DESC
26 дек 16, 11:37    [20048107]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом на выборку, пожалуйста  [new]
Artprog
Member

Откуда: Краснодар
Сообщений: 55
КусокАналитика,

Microsoft SQL Server 2014 - 12.0.4213.0 (X64)
Jun 9 2015 12:06:16
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
26 дек 16, 16:37    [20049664]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом на выборку, пожалуйста  [new]
Artprog
Member

Откуда: Краснодар
Сообщений: 55
MSSQLAndDotNet,

Я пробовал использовать рекурсию, но она дает огромное количество дублей и запрос виснет.
Вобщем я делаю фильтр товаров на сайте, и там значения фильтров зависят друг от друга.
Вот страница сайта: http://takbox.artprog.net/categories/bagazhniki-v-sbore
Тут все работает правильно - Выбрал Toyota - вышли модели тойоты, далее выбрал год авто.
Мне нужно сделать, чтобы после выбора марки Toyota следовал выбор года, а затем выбор модели.
Но при этом, если я выберу Марку Тойота, год 2009, то в список моделей попадут ВСЕ модели 2009 года всех марок, а не только модели тойот 2009 года.

Для решения этой проблемы мне нужно получить список родительских свойств. Например у Камри родительскими свойствами являются года 2001-2016 и марка Toyota.
26 дек 16, 16:47    [20049710]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом на выборку, пожалуйста  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
лучше бы дать выбирать год и марку независимо, а там уже по году отсеивать список моделей...
26 дек 16, 17:10    [20049866]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом на выборку, пожалуйста  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
а вообще, я вижу неудачное решение при проектировании БД, и как следствие, сложности с реализацией простейших запросов...
26 дек 16, 17:13    [20049875]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом на выборку, пожалуйста  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
MSSQLAndDotNet
Artprog,

Я так понял Вам просто обход дерева надо сделать
Вот пример обхода снизу вверх для орг структуры
Сверху вниз аналогично для своей задачи переделайте


+
	;WITH Rec(org_id, org_name,  org_parent_org_id, [order]) AS
	(
		SELECT org_id, o.org_name, org_parent_org_id, 0 AS [order]
		FROM Orgs AS o
		WHERE o.org_id = 'c1efaaa7-9a7e-11e6-9e3b-18a90550aa54'
		
		UNION ALL 
		
		SELECT o.org_id, o.org_name, o.org_parent_org_id, (r.[order] + 1) AS [order]
		FROM Orgs AS o
			INNER JOIN Rec AS r ON r.org_parent_org_id = o.org_id		
	)
	
	SELECT r.org_id, ROW_NUMBER() OVER (ORDER BY r.[order] DESC) AS rn
	FROM Rec AS r		
	ORDER BY r.[order] DESC

ЛЬШГ блистнул знанеями?
26 дек 16, 20:40    [20050457]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить