我在MS SQL Server 2005上有这个查询:
...INNER JOIN [table1].[Id] = [table2].[Label_Id]
Label_Id是一个包含如下数据的字段:
'Test_MyId'
我有一个自定义拆分函数,它从字符串返回一个包含2行的表。
如何将table1.Id与split函数返回结果第二行中的Id进行比较?
答案 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