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

Откуда:
Сообщений: 26
Доброе время суток!
Есть таблица Analogs(аналогичные ID типа 1 = 2, 2 = 3)
AB
1 2
2 3
4 2
4 44
Нужно сделать запрос чтобы выводил все аналогичные значения, например для 2 это будет 1, 3, 4, 44.
Делал такой запрос
SELECT (case when A != 2 then A else B end) as ANALOG FROM TovarAnalogs WHERE A = 2 OR B = 2;

Выводит
ANALOG
1
3
4
Нужно чтобы выводил и 44 (потому что 4 = 44) вот.
21 мар 14, 19:39    [15768713]     Ответить | Цитировать Сообщить модератору
 Re: Выборка связных значений из таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47105
wewenami2,

рекурсивное CTE
21 мар 14, 20:47    [15768934]     Ответить | Цитировать Сообщить модератору
 Re: Выборка связных значений из таблицы  [new]
wewenami2
Member

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

спасибо, вот сделал вот такой запрос
WITH Anal(ID) as 
(SELECT (case when A != 2 then A else B end) FROM Analogs WHERE A = 2 OR B = 2
union all 
SELECT (case when A != Anal.ID then A else B end) FROM Analogs 
INNER JOIN Anal ON A = Anal.ID WHERE A = Anal.ID OR B = Anal.ID)
select distinct ID FROM Anal WHERE ID != 2;
Выводит всё как надо, только мне его надо использовать в WHERE другого запроса, а там ругается на WITH, вот такой запрос
SELECT ID, NAME FROM Items WHERE ID IN 
(WITH Anal(ID) as 
(SELECT (case when A != 2 then A else B end) FROM Analogs WHERE A = 2 OR B = 2
union all 
SELECT (case when A != Anal.ID then A else B end) FROM Analogs 
INNER JOIN Anal ON A = Anal.ID WHERE A = Anal.ID OR B = Anal.ID)
select distinct ID FROM Anal WHERE ID != 2);
21 мар 14, 21:50    [15769149]     Ответить | Цитировать Сообщить модератору
 Re: Выборка связных значений из таблицы  [new]
wewenami2
Member

Откуда:
Сообщений: 26
С этим разобрался, вот так
WITH Anal(ID) as 
(SELECT (case when A != 2 then A else B end) FROM Analogs WHERE A = 2 OR B = 2
union all 
SELECT (case when A != Anal.ID then A else B end) FROM Analogs 
INNER JOIN Anal ON A = Anal.ID WHERE A = Anal.ID OR B = Anal.ID)
SELECT ID, NAME FROM Items WHERE ID IN (select ID from Anal);

Теперь нужно сделать запрос типа
SELECT ID, NAME, COUNT, (SELECT (SUM(COUNT) FROM Items WHERE ID IN (SELECT ID FROM Anal))) as SumAnalogs FROM Items
Куда сдесь засунуть WITH не знаю
21 мар 14, 23:44    [15769611]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить