T-SQL: внутреннее объединение в поле с 2 значениями - PullRequest
1 голос
/ 31 января 2011

У меня есть этот запрос на MS SQL Server 2005:

...INNER JOIN [table1].[Id] = [table2].[Label_Id]

Label_Id - это поле, содержащее такие данные:

'Test_MyId'

У меня есть пользовательская функция split, которая возвращает из строки таблицу из 2 строк.

Как сравнить мой table1.Id с идентификатором во 2-й строке возвращаемого результата функции split?

Ответы [ 4 ]

1 голос
/ 31 января 2011

Как сказали Кассной и Андомар, до явного упорядочения набор строк, представленных таблицей, не имеет порядка, и ядро ​​базы данных может возвращать строки таблицы в любом последовательном порядке, который он хочет.Вы можете либо сделать вторую строку первой строкой, упорядочив строки каким-либо образом, либо изменить свою пользовательскую функцию разделения, чтобы она возвращала только интересующую вас строку.

0 голосов
/ 31 января 2011

Вот что работает в SQL Server 2008

DECLARE @stringsInOrder TABLE
(
  WordNumber INT IDENTITY(1,1) NOT NULL,
  Value VARCHAR(max) 
)

INSERT INTO @stringsInOrder (Value)
    (SELECT value FROM [dbo].fnSplit(@StringWhichGetsSplit))

SELECT value FROM @stringsInOrder WHERE WordNumber=2
0 голосов
/ 31 января 2011

В SQL не существует «первой строки» или «строки второй строки», если вы не определите их с помощью ORDER BY.

SELECT  *
FROM    (
        SELECT  value, ROW_NUMBER() OVER (PARTITION BY t2.id ORDER BY …) AS rn
        FROM    table2 t2
        CROSS APPLY
                my_tvf(label_id)
        ) t2
JOIN    table1 t1
ON      t1.id = t2.value
        AND t2.rn = 2

. Вы должны написать условие ORDER BY, которое помещаетзаписи в правильном порядке.

Лучше всего будет вернуть дополнительный столбец string_no из вашего TVF (в этом случае вам даже не понадобится ROW_NUMBER:

SELECT  *
FROM    table1 t1
JOIN    table2 t2
ON      t1.id = t2.value
CROSS APPLY
        my_tvf(t2.label_id) s
WHERE   s.string_no = 2
0 голосов
/ 31 января 2011

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

INNER JOIN [table1].[Id] = (select col2 from dbo.fnSplit(table2.Label_Id))

Если вы имели в виду вторую строку , она становится более сложной. Вам нужно найти способ сообщить базе данных, что такое «вторая строка»; по умолчанию строки не упорядочены.

INNER JOIN [table1].[Id] = 
    (
    select col1 
    from   (
           select col1
           ,      row_number() over (order by SomeColumn)
           from   dbo.fnSplit([table2].[Label_Id]
           ) as SubQueryAlias
    where  rn = 2
    )

Здесь я заказываю на SomeColumn. Если у вас есть столбец, который идентифицирует строку, это было бы еще лучше.

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