SQL-запрос для выбора связанных данных из двух столбцов - PullRequest
1 голос
/ 03 декабря 2011

У меня есть таблица имен SQL, заполненная так:

 slno          from        to  
  1              a          e 
  2              a          b
  3              c          d
  4              c          e 
  .......  like this 

Все эти записи должны быть зарегистрированы, чтобы показать, с кем они связаны
Теперь мне нужно выбрать оператор, чтобы выбрать связанный.

firstly  i used 

   Select * from names where from= @zx        
   (@zx is the session )

этим я могу получить значения только для a и c.

Но мне нужно отобразить связанные данные b, d и e, мне нужно использовать только одну команду выбора. есть ли какая-либо команда выбора для выбора взаимосвязанных данных. каждый раз, когда кто-то из них вошел в систему, нужно показать, с кем он связан.

Ответы [ 2 ]

0 голосов
/ 03 декабря 2011

Непонятно, что вы хотите.Хотите ли вы отобразить пользователей сеанса и пользователей, для которых первый набор пользователей связан отношениями «от - до» (назовем их родителями / детьми)?

Или вы тоже хотитедля отображения тех, к которым относится ВТОРОЙ список пользователей?

Например, для этих данных:

slno   from     to
 1      a         b
 1      b         c
 1      c         d

Хотите отобразить:

  • a и b

  • ab, bc и cd пары?

Для 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
0 голосов
/ 03 декабря 2011

Вам нужно использовать внутреннее соединение, чтобы дважды ссылаться на таблицу.

select * 
from 
  names as t1 inner join 
  names as t2 on t1.[from] = t2.[to] 
where t1.[from]= @zx

Если вы попытаетесь сделать это рекурсивным способом, вы не сможете управлять им за один раз.выберите команду.Вы можете поместить логику в хранимую процедуру, которая будет повторяться по набору данных несколько раз, пока ваш набор не будет собран, а затем вернуть полный набор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...