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