2016-07-01 50 views
1

我有以下查詢:SQL - 查詢使用XML路徑

SELECT  ara.req_id 
FROM  tbl_ara ara 
WHERE  id in (
         SELECT STUFF((
         SELECT ',' + cast(id as varchar(8000)) 
         FROM contact 
         WHERE ct_id = 2 
         FOR XML PATH('') 
         ), 1, 1, '')) 

所以,孤單是表名contact,我想所有的ids當他們的2類型。然後我用Stuff創建一個列表。 然後,我想使用另一個表並獲取它們的id在該列表上的所有記錄。 您可以在查詢中看到邏輯。 問題是,SQL不承認它是名單,我得到以下錯誤:

Msg 245, Level 16, State 1, Line 11 Conversion failed when converting the nvarchar value '6019,49111,49112' to data type int.

回答

3

STUFF在你的情況下返回字符數據。從文檔(https://msdn.microsoft.com/en-us/library/ms188043.aspx):

Returns character data if character_expression is one of the supported character data types. Returns binary data if character_expression is one of the supported binary data types.

所以你沒有得到ID列表,而是包含數字和逗號的字符串。

是否有沒有直接使用ID的原因?

SELECT 
    [ara].[req_id] 
FROM [tbl_ara] [ara] 
WHERE [id] IN 
      (
       SELECT 
        [id] 
       FROM [contact] 
       WHERE [ct_id] = 2 
      ) 

編輯:當然JOIN解決方案通過@ gofr1是一個相當不錯的選擇,太多。

+0

是的,有一個原因。自從上次我使用SQL以來,它已經有一段時間了:)謝謝 – BlackM

2

最簡單的方法是JOIN:

SELECT ara.req_id 
FROM tbl_ara ara 
INNER JOIN contact c 
    ON ara.id = c.id 
WHERE c.ct_id = 2 

如果你想運行使用STUFF那麼你應該使用動態SQL。起初準備語句,然後執行它:

DECLARE @sql nvarchar(max), @inpart nvarchar(max) 

SELECT @inpart = STUFF((
        SELECT ',' + cast(id as varchar(8000)) 
        FROM contact 
        WHERE ct_id = 2 
        FOR XML PATH('') 
        ), 1, 1, '') 


SELECT @sql = ' 
SELECT  ara.req_id 
FROM  tbl_ara ara 
WHERE  id in (' + @inpart+ ')' 


PRINT @sql 

--EXEC sp_executesql @sql 

PRINT會得到你:

SELECT  ara.req_id 
FROM  tbl_ara ara 
WHERE  id in (6019,49111,49112) 

取消註釋EXEC sp_executesql @sql執行查詢。

1

你爲什麼不試試這個:

SELECT ara.req_id 
FROM tbl_ara As ara 
WHERE Exists(Select 1 
       From contact As c 
       Where c.ct_id = 2 
         And c.id = ara.id 
      ) 

由於存在條款只檢查一個匹配的存在,並返回該行,當找到匹配。