T-SQL:具有2个值的字段的内部联接

时间:2011-01-31 15:31:29

标签: sql string split inner-join

我在MS SQL Server 2005上有这个查询:

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

Label_Id是一个包含如下数据的字段:

'Test_MyId'

我有一个自定义拆分函数,它从字符串返回一个包含2行的表。

如何将table1.Id与split函数返回结果第二行中的Id进行比较?

4 个答案:

答案 0 :(得分:1)

正如Quassnoi和Andomar所说,在显式排序之前,由表表示的行集没有顺序,数据库引擎可以按照它想要的任何顺序自由返回表行。您可以通过以某种方式排序行来使第二行成为第一行,或者您可以修改自定义拆分函数以仅返回您感兴趣的行。

答案 1 :(得分:0)

您可以使用子查询来处理表值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。如果你有一个标识字符串的列,那就更好了。

答案 2 :(得分:0)

这是在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

答案 3 :(得分:0)

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