2011-01-31 21 views
1

我有一個MS SQL Server 2005的這個查詢:T-SQL:內蒙古在現場加入2個值

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

Label_Id是包含這樣的數據的字段:

'Test_MyId' 

我有一個自定義的分割函數,它從一個字符串返回一個2行的表。

如何將我的table1.Id與分割函數的返回結果的第二行中的Id進行比較?

+0

Can你提供更多的細節?看起來像一個子查詢或一個完整的外部連接可以工作,但很難告訴你上面提供的是什麼。 – shookdiesel 2011-01-31 15:34:40

+0

請發佈你如何使用你的分割功能。通過簡單地向連接條件添加更多項目,甚至可以使用CTE,您可以輕鬆完成這樣的事情。沒有看到你如何分裂,我不能給你一個好的建議。 – Kris 2011-01-31 15:35:05

回答

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。如果你有一個標識字符串的列,那會更好。

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 
+0

Msg 195,Level 15,State 10,Line 1 'last'不是公認的內置函數名稱。 – Andomar 2011-01-31 15:45:09

0

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 
1

的:

的最好的事情是從TVF(在這種情況下,你甚至不需要一個ROW_NUMBER返回一個額外string_no列由表表示的行沒有順序,並且數據庫引擎可以按照它想要的任何順序返回錶行。可以通過以某種方式排序行來使第二行成爲第一行,或者可以修改您的自定義拆分功能僅返回您感興趣的行。