Непонятно, что вы хотите.Хотите ли вы отобразить пользователей сеанса и пользователей, для которых первый набор пользователей связан отношениями «от - до» (назовем их родителями / детьми)?
Или вы тоже хотитедля отображения тех, к которым относится ВТОРОЙ список пользователей?
Например, для этих данных:
slno from to
1 a b
1 b c
1 c d
Хотите отобразить:
Для ab выполните:
Select * from names where from= @zx
UNION
-- For a large set of data, use inner join instead
select * from names
where from IN
(Select to from names where from= @zx)
and from= @zx
ВторойКак уже отмечалось, это действительно должно быть сделано как объединение:
Select * from names where from= @zx
UNION
Select n2.* from names as n_from, names as n2
where n1.from= @zx and n2.from=n1.to
Для другого варианта вам нужно в основном рекурсивное извлечение, использующее некоторый алгоритм обхода дерева.
Вы не можете сделать это в pure SQL, если речь идет о реляционных данных.Вы должны либо использовать цикл (в SQL или в вашем программном драйвере), либо, если ваша база данных позволяет вам, вы можете написать рекурсивное выражение, которое фактически будет работать одинаково.
К счастью для вас, SQL Server фактически позволяетпоследний.Как показано в следующей отличной записи блога: http://blog.sqlauthority.com/2008/07/28/sql-server-simple-example-of-recursive-cte/ (замените EmployeeID на to и ManagerID на from)
USE AdventureWorks
GO
WITH Emp_CTE AS (
SELECT EmployeeID, ContactID, LoginID, ManagerID, Title, BirthDate
FROM HumanResources.Employee
WHERE ManagerID IS NULL
UNION ALL
SELECT e.EmployeeID, e.ContactID, e.LoginID, e.ManagerID, e.Title, e.BirthDate
FROM HumanResources.Employee e
INNER JOIN Emp_CTE ecte ON ecte.EmployeeID = e.ManagerID
)
SELECT *
FROM Emp_CTE
GO