Внутреннее соединение SQL Server 2008 с запятыми - PullRequest
0 голосов
/ 13 марта 2012

Я пытаюсь выяснить, как внутреннее соединение таблицы с идентификаторами в моей таблице, в которой все идентификаторы в одной строке разделены запятыми.

Таблица с запятыми называется (PA):

usersIDs
56488,51233,71055,98304,21577,12500

Таблица (SU) имеет идентификатор и имя пользователя:

UserID | Name
51233  | Bob Barker
21577  | Billy Knox
56488  | David Miller
etc etc

Как можно внутренне объединить имя с идентификаторами, разделенными запятыми, в моей первой таблице?

 SELECT DISTINCT SU.Name, SU.UserID, SU.Enabled
 FROM Sec_User AS SU INNER JOIN
    Program_Access AS PA ON SU.UserId = PA.userIDS

Ответы [ 3 ]

3 голосов
/ 13 марта 2012

Вот способ без функции:

SELECT DISTINCT SU.UserID, SU.Name, SU.Enabled
 FROM dbo.Sec_User AS SU
 INNER JOIN dbo.Program_Access AS PA
 ON ',' + PA.usersIDs + ',' LIKE '%,' + RTRIM(SU.UserID) + ',%';

Но включая функцию для полноты (и потому, что такая функция очень полезна для многих целей).Сначала создайте табличную функцию:

CREATE FUNCTION dbo.SplitInts
(
   @List       VARCHAR(MAX),
   @Delimiter  CHAR(1)
)
RETURNS TABLE
AS
   RETURN ( SELECT Item = CONVERT(INT, Item) FROM ( 
     SELECT Item = x.i.value('(./text())[1]', 'int') FROM ( 
       SELECT [XML] = CONVERT(XML, '<i>' + REPLACE(@List, @Delimiter, '</i><i>') 
       + '</i>').query('.') ) AS a CROSS APPLY [XML].nodes('i') AS x(i)) AS y
     WHERE Item IS NOT NULL
   );

Теперь JOIN:

 SELECT DISTINCT SU.UserID, SU.Name, SU.Enabled
  FROM dbo.Program_Access AS PA 
  CROSS APPLY dbo.SplitInts(PA.usersIDs, ',') AS s
  INNER JOIN dbo.Sec_User AS SU
  ON SU.UserID = s.Item;
1 голос
/ 13 марта 2012

1) Прежде всего, создайте функцию разделения. Пример здесь .

2) Затем попробуйте сделать так:

DECLARE @PA TABLE
 ( usersIDs VARCHAR(50))

 INSERT INTO @PA(usersIDs) VALUES('56488,51233,71055,98304,21577,12500')

DECLARE @SU TABLE
(UserID INT, Name VARCHAR(50))

[enter link description here][2]INSERT INTO @SU(UserID, Name) VALUES (51233, 'Bob Barker')
INSERT INTO @SU(UserID, Name) VALUES (21577, 'Billy Knox')
INSERT INTO @SU(UserID, Name) VALUES (56488, 'David Miller')

SELECT * FROM @PA 
CROSS APPLY dbo.fnSplit(usersIDs,',')
LEFT JOIN @SU ON item = UserID
0 голосов
/ 13 марта 2012

По этой ссылке Как разделить строку с запятой , вы можете получить результаты, подобные этому:

NewPA_Table
RecID       UserID
1            56488
2            51233
3            71055
4            98304
5            21577
6            12500

и сгенерировав этот результат, вы теперь можете присоединить его к таблице SU.

...