Sql 使用STUFF函数仅获取与表中的列匹配的值

Sql 使用STUFF函数仅获取与表中的列匹配的值,sql,sql-server,Sql,Sql Server,我使用stuff函数作为: STUFF((SELECT DISTINCT ', ' + CAST(id as varchar) FROM users WHERE userID = depatments.userID FOR XML PATH('')), 1, 1, '') AS Users 每个用户都有一个部门,我想返回与该部门匹配的users表的值,但它返回的是该列中所有行的所有值。如何修复它?首先,我猜用户有id,但没有userid。因此: S

我使用stuff函数作为:

STUFF((SELECT DISTINCT ', ' + CAST(id as varchar)
       FROM users 
       WHERE userID = depatments.userID 
       FOR XML PATH('')), 1, 1, '') AS Users

每个用户都有一个部门,我想返回与该部门匹配的users表的值,但它返回的是该列中所有行的所有值。如何修复它?

首先,我猜用户有
id
,但没有
userid
。因此:

STUFF((SELECT DISTINCT ', ' + CAST(id as varchar(255))
       FROM users u
       WHERE u.id = departments.userID 
       FOR XML PATH('')
      ), 1, 1, ''
     ) AS Users
注:

  • 切勿使用没有长度的
    varchar
    (或相关类型)。SQL Server的默认长度因上下文而异,可能不够大
  • 始终限定查询中的所有列引用,以便清楚它们来自何处。如果在查询中使用
    u.userid-departments.userid
    ,则会出现错误并修复代码
  • 使用表别名,以便更易于编写和读取查询

样本数据和预期结果将有所帮助。特别是如果您以DDL/DML的形式提供样本数据供我们测试。-您应该始终为您使用的任何
varchar
变量和参数提供长度您使用的是哪个SQL Server版本?
STUFF
唯一要做的就是删除前面的
。字符串聚合由
XML PATH()
执行。SQL Server 2017引入了
STRING\u AGG
,因此不再需要XML路径这是我获取该用户行中所有值的地方,它不会带来匹配的结果,但所有行都填充了大量ID,所有行的al都相同