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

Откуда:
Сообщений: 55
Предположим есть узел, который связан с другими такими же узлами. Для какого-то кнонкретного узла нужно вывести всех связанных с ним. Можно сделать так:
declare @node table (id int, someId int)
declare @node_to_node table(node1Id int, node2Id int)

insert into @node(id, someId) values (1,1), (2,1), (3,2), (4,3)
insert into @node_to_node(node1Id, node2Id) values (1,1), (2,1), (1,2)

declare @someIdToSearch as int
set @someIdToSearch = 1

select n1.Id, n1.someId
from @node_to_node ntn
join @node n1 on ntn.node1Id = n1.id
join @node n2 on ntn.node2Id = n2.id
where n2.someId = @someIdToSearch
union
select n2.Id, n2.someId
from @node_to_node ntn
join @node n1 on ntn.node1Id = n1.id
join @node n2 on ntn.node2Id = n2.id
where n1.someId = @someIdToSearch


Смущает во-первых union, во вторых большое количество join-ов. Конечно при добавлении индексов на node1Id и node2Id с соответсвующими include (node2Id и node2Id) улучшают просизводительность, но при большом количестве связей начинает подтормаживать. Есть альтернативные способы представления таких связей?
13 авг 14, 20:03    [16438483]     Ответить | Цитировать Сообщить модератору
 Re: Многие ко многим для одной сущности  [new]
SERG1257
Member

Откуда:
Сообщений: 2828
Ээ вы пытаетесь сделать?

select n1.Id, n1.someId
from @node_to_node ntn
join @node n1 on ntn.node1Id = n1.id
join @node n2 on ntn.node2Id = n2.id
where n2.someId = @someIdToSearch or n1.someId = @someIdToSearch
13 авг 14, 20:50    [16438588]     Ответить | Цитировать Сообщить модератору
 Re: Многие ко многим для одной сущности  [new]
Spinifex
Member

Откуда:
Сообщений: 55
SERG1257,
Это не то же самое, при "or n1.someId = @someIdToSearch" нужно выводить n2.Id, n2.someId. А у вас в запросе выводится сам узел, а не связанный с ним.
13 авг 14, 21:31    [16438687]     Ответить | Цитировать Сообщить модератору
 Re: Многие ко многим для одной сущности  [new]
SERG1257
Member

Откуда:
Сообщений: 2828
Spinifex
А у вас в запросе выводится сам узел, а не связанный с ним.
Это можно решить с помощью case when then end.
По производительности скорее всего будет таким же как и ваш запрос, только выглядеть будет короче.
13 авг 14, 22:37    [16438855]     Ответить | Цитировать Сообщить модератору
 Re: Многие ко многим для одной сущности  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
declare @node table (id int, someId int)
declare @node_to_node table(node1Id int, node2Id int)

insert into @node(id, someId) values (1,1), (2,1), (3,2), (4,3)
insert into @node_to_node(node1Id, node2Id) values (1,1), (2,1), (1,2)

declare @someIdToSearch as int
set @someIdToSearch = 1

select distinct
 case when node1Id = @someIdToSearch then node2Id else node1Id end as id
,@someIdToSearch as someid
from @node_to_node
where node1Id = @someIdToSearch or  node2Id = @someIdToSearch
14 авг 14, 07:05    [16439209]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить