[英]SQL - Query using XML Path
我有以下查詢:
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
表,當它們的類型為2
時,我想獲取所有ids
。 然后用Stuff創建一個列表。 然后,我想使用另一個表並獲取其id
在該列表上的所有記錄。 您可以在查詢中看到邏輯。 問題是SQL無法將其識別為列表,並且出現以下錯誤:
消息245,級別16,狀態1,行11將nvarchar值'6019,49111,49112'轉換為數據類型int時轉換失敗。
在您的情況下, STUFF
返回字符數據。 從文檔( https://msdn.microsoft.com/en-us/library/ms188043.aspx ):
如果character_expression是受支持的字符數據類型之一,則返回字符數據。 如果character_expression是受支持的二進制數據類型之一,則返回二進制數據。
因此,您不會得到ID的列表,而是得到包含數字和逗號的字符串。
是否有不直接使用ID的原因?
SELECT
[ara].[req_id]
FROM [tbl_ara] [ara]
WHERE [id] IN
(
SELECT
[id]
FROM [contact]
WHERE [ct_id] = 2
)
編輯:當然,@ gofr1的JOIN
解決方案也是一個不錯的選擇。
最簡單的方法是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
以執行查詢。
你為什么不試試這個:
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
)
As exist子句僅檢查單個匹配項的存在,並在找到匹配項時返回該行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.