Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Spinifex Member Откуда: Сообщений: 55 |
SERG1257, Это не то же самое, при "or n1.someId = @someIdToSearch" нужно выводить n2.Id, n2.someId. А у вас в запросе выводится сам узел, а не связанный с ним. |
13 авг 14, 21:31 [16438687] Ответить | Цитировать Сообщить модератору |
SERG1257 Member Откуда: Сообщений: 2828 |
По производительности скорее всего будет таким же как и ваш запрос, только выглядеть будет короче. |
||
13 авг 14, 22:37 [16438855] Ответить | Цитировать Сообщить модератору |
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 | ![]() |