我有一個MS SQL Server 2005的這個查詢:T-SQL:內蒙古在現場加入2個值
...INNER JOIN [table1].[Id] = [table2].[Label_Id]
Label_Id是包含這樣的數據的字段:
'Test_MyId'
我有一個自定義的分割函數,它從一個字符串返回一個2行的表。
如何將我的table1.Id與分割函數的返回結果的第二行中的Id進行比較?
我有一個MS SQL Server 2005的這個查詢:T-SQL:內蒙古在現場加入2個值
...INNER JOIN [table1].[Id] = [table2].[Label_Id]
Label_Id是包含這樣的數據的字段:
'Test_MyId'
我有一個自定義的分割函數,它從一個字符串返回一個2行的表。
如何將我的table1.Id與分割函數的返回結果的第二行中的Id進行比較?
你可以使用子查詢從表值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
。如果你有一個標識字符串的列,那會更好。
這裏的東西,在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
Msg 195,Level 15,State 10,Line 1 'last'不是公認的內置函數名稱。 – Andomar 2011-01-31 15:45:09
在SQL
的作品,沒有「第一行」或「secong行」,除非你有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
條件,以正確的順序放置記錄。由於Quassnoi和Andomar說,直到明令,設定
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
的:
的最好的事情是從TVF
(在這種情況下,你甚至不需要一個ROW_NUMBER
返回一個額外string_no
列由表表示的行沒有順序,並且數據庫引擎可以按照它想要的任何順序返回錶行。可以通過以某種方式排序行來使第二行成爲第一行,或者可以修改您的自定義拆分功能僅返回您感興趣的行。
Can你提供更多的細節?看起來像一個子查詢或一個完整的外部連接可以工作,但很難告訴你上面提供的是什麼。 – shookdiesel 2011-01-31 15:34:40
請發佈你如何使用你的分割功能。通過簡單地向連接條件添加更多項目,甚至可以使用CTE,您可以輕鬆完成這樣的事情。沒有看到你如何分裂,我不能給你一個好的建議。 – Kris 2011-01-31 15:35:05