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

Откуда:
Сообщений: 32
Здравствуйте!
Имеются 2 таблицы
CREATE TABLE [AddressDictionary].[Street](
[StreetId] [int] IDENTITY(1,1) NOT NULL,
[Guid] [uniqueidentifier] NOT NULL,
[StreetTypeId] [smallint] NOT NULL,
[CityId] [smallint] NOT NULL,
[CityRegionId] [smallint] NULL,
[code] [varchar](10) NULL,
[Name] [varchar](50) NOT NULL,
[IsDeleted] [bit] NOT NULL,
[MergedTo] [int] NULL)

CREATE TABLE [AddressDictionary].[City](
[CityId] [smallint] IDENTITY(1,1) NOT NULL,
[Guid] [uniqueidentifier] NOT NULL,
[CityTypeId] [smallint] NOT NULL,
[DistrictId] [smallint] NULL,
[RegionId] [smallint] NULL,
[code] [varchar](10) NULL,
[Name] [varchar](50) NOT NULL,
[IsCityRegion] [bit] NOT NULL,
[IsDeleted] [bit] NOT NULL,
[MergedTo] [smallint] NULL)

Все не писал чтобы не нагружать сообщение. Связка думаю понятна. Нужно построить дерево типа
город-улица. Нужно для отображения на клиенте. Оператор отмечает города, улицы и id улиц используются для построения фильтра в запросе. Вопрос, как это сделать если id в таблице повторяются?
8 окт 09, 18:53    [7761043]     Ответить | Цитировать Сообщить модератору
 Re: Дерево из двух таблиц в sql 2005  [new]
vino
Member

Откуда:
Сообщений: 1191
VAbramyak, здесь не дерево, а мастер-детайл на клиенте. Зачем на сервере лепить?
8 окт 09, 19:08    [7761089]     Ответить | Цитировать Сообщить модератору
 Re: Дерево из двух таблиц в sql 2005  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Версию сервера не указали.
Да и тестовых данных нет.

+ Ну блин и структура
Есть и ID и GUID и code, зачем?
Если IsCityRegion = CASE WHEN RegionId IS NULL THEN 0 ELSE 1 END, то зачем это нужно?
CityRegionId также зачем, если его можно получить из ссылаемой таблы?
И много структурно одинаковых элементов: ID, GUID, Type, Parent, Region, Code, Name, Deleted, Merged.
А для чего MergedTo? Ссылка на унаследовавший элемент?

Иногда делают древовидную структуру "Region". Соответственно глубина, точнее тип и показывает континент/страна/штат/республика/регион/область/город/посёлок/район/улица ... А иногда так и не делают. :)
Просто у всех структура разная и да и не линейная по сути в общем, и в добавок детализация данных разная -- дерево спасает.
VAbramyak
Вопрос, как это сделать если id в таблице повторяются?
Как это?

С идентификаторами городов можно выкрутится, например ... отрицательным значением:
SELECT	-C.CityId	AS Region
	,C.GUID
--	,C.RegionId	AS Parent
--	,0		AS Parent
	,NULL		AS Parent
--	,C.CityTypeId	AS Type
	,C.Code
	,C.Name
	,CASE	WHEN C.MergedTo IS NOT NULL
		THEN 1
		ELSE C.IsDeleted
		END	AS Deleted
	,-C.MergedTo	AS Merged
FROM	AddressDictionary.City	C
WHERE	    C.IsDeleted = 0 AND C.MergedTo IS NULL
UNION ALL
SELECT	 S.StreetId	AS Region
	,S.GUID
	,-S.CityId	AS Parent
--	,S.StreetTypeId	AS Type
	,S.Code
	,S.Name
	,CASE	WHEN S.MergedTo IS NOT NULL
		  OR C.MergedTo IS NOT NULL
		THEN 1
		ELSE S.IsDeleted | C.IsDeleted
		END	AS Deleted
	,S.MergedTo	AS Merged
FROM	     AddressDictionary.Street	S
	JOIN AddressDictionary.City	C ON C.CityId = S.CityId
WHERE	    S.IsDeleted = 0 AND S.MergedTo IS NULL
	AND C.IsDeleted = 0 AND C.MergedTo IS NULL
Сами уберёте лишнее, навеянное моим больным воображением. :)
Думаю можно надумать ещё пару извратных способа.
8 окт 09, 21:52    [7761472]     Ответить | Цитировать Сообщить модератору
 Re: Дерево из двух таблиц в sql 2005  [new]
VAbramyak
Member

Откуда:
Сообщений: 32
Mnior
Версию сервера не указали.
Да и тестовых данных нет.

+
+ Ну блин и структура
Есть и ID и GUID и code, зачем?
Если IsCityRegion = CASE WHEN RegionId IS NULL THEN 0 ELSE 1 END, то зачем это нужно?
CityRegionId также зачем, если его можно получить из ссылаемой таблы?
И много структурно одинаковых элементов: ID, GUID, Type, Parent, Region, Code, Name, Deleted, Merged.
А для чего MergedTo? Ссылка на унаследовавший элемент?

Иногда делают древовидную структуру "Region". Соответственно глубина, точнее тип и показывает континент/страна/штат/республика/регион/область/город/посёлок/район/улица ... А иногда так и не делают. :)
Просто у всех структура разная и да и не линейная по сути в общем, и в добавок детализация данных разная -- дерево спасает.
VAbramyak
Вопрос, как это сделать если id в таблице повторяются?
Как это?

С идентификаторами городов можно выкрутится, например ... отрицательным значением:
SELECT	-C.CityId	AS Region
	,C.GUID
--	,C.RegionId	AS Parent
--	,0		AS Parent
	,NULL		AS Parent
--	,C.CityTypeId	AS Type
	,C.Code
	,C.Name
	,CASE	WHEN C.MergedTo IS NOT NULL
		THEN 1
		ELSE C.IsDeleted
		END	AS Deleted
	,-C.MergedTo	AS Merged
FROM	AddressDictionary.City	C
WHERE	    C.IsDeleted = 0 AND C.MergedTo IS NULL
UNION ALL
SELECT	 S.StreetId	AS Region
	,S.GUID
	,-S.CityId	AS Parent
--	,S.StreetTypeId	AS Type
	,S.Code
	,S.Name
	,CASE	WHEN S.MergedTo IS NOT NULL
		  OR C.MergedTo IS NOT NULL
		THEN 1
		ELSE S.IsDeleted | C.IsDeleted
		END	AS Deleted
	,S.MergedTo	AS Merged
FROM	     AddressDictionary.Street	S
	JOIN AddressDictionary.City	C ON C.CityId = S.CityId
WHERE	    S.IsDeleted = 0 AND S.MergedTo IS NULL
	AND C.IsDeleted = 0 AND C.MergedTo IS NULL
Сами уберёте лишнее, навеянное моим больным воображением. :)
Думаю можно надумать ещё пару извратных способа.


Спасибо за ответ!

Насчет структуры, писал не я, но дело в том что данные из разных баз могут сливатся в одну, для того и добавлен гуид.
Версию в названии темы писал.

Вопрос, как это сделать если id в таблице повторяются?
Как это?
Имелось ввиду в таблицах.
8 окт 09, 23:21    [7761797]     Ответить | Цитировать Сообщить модератору
 Re: Дерево из двух таблиц в sql 2005  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
VAbramyak
данные из разных баз могут сливатся в одну, для того и добавлен гуид
Это никак не отвечает на вопрос.

VAbramyak
Версию в названии темы писал.
Чёрд. Часто пропускаю заголовки, т.к. сначала открываю выбранные топики в фоне, а затем читаю содержимаю. :roll:

VAbramyak
Вопрос, как это сделать если id в таблице повторяются?
Как это?
Имелось ввиду в таблицах.
Прям как из анекдота. "Ты что т .... Ну не понятно же!"
Ясное дело что в таблицах, не в апельсинах же.
T1(1,2,3) и T2(2,3,4) - ID повторяются 2 и 3 в обоих таблах
T1(1,2,1) и T2(3,4,4) - ID повторяются - дублируются (да, есть такое слово)

Идентификация однозначная? Неужели ID дублируются?

Понимаете, можно путём длинных логических умозаключений и вероятностных предположений понять что написано/сказано. Но выражаться однозначно всё равно надо. В добавок небольшое излишество будет работать как контрольная сумма.
9 окт 09, 11:52    [7763425]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить