簡體   English   中英

SQL-使用XML路徑查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM