Sql 尝试使用带有except的FOR XML路径

Sql 尝试使用带有except的FOR XML路径,sql,sql-server,tsql,Sql,Sql Server,Tsql,我试图在一行而不是多行中打印结果。 我有一个查询,如下所示: SELECT DISTINCT RTRIM(LTRIM(MACHNAME)) FROM MACHS WHERE MACHID <> 0 EXCEPT SELECT DISTINCT RTRIM(LTRIM(MACHNAME)) FROM GROUPS WHERE GROUPS.GROUPTYPE = 'M' 通过使用Except查询,我有

我试图在一行而不是多行中打印结果。 我有一个查询,如下所示:

SELECT DISTINCT  RTRIM(LTRIM(MACHNAME))
  FROM MACHS
  WHERE MACHID <> 0

EXCEPT 

SELECT DISTINCT RTRIM(LTRIM(MACHNAME))
                 FROM GROUPS
                WHERE GROUPS.GROUPTYPE = 'M' 
通过使用Except查询,我有:

行号名称

1 WinMach2

2 WinMach6

我希望:

WinMach2,WinMach6

因此,为了在一行中打印结果,我尝试:

select stuff((SELECT DISTINCT ', ' + RTRIM(LTRIM(MACHNAME))
  FROM MACHS
  WHERE MACHID <> 0

EXCEPT 

SELECT DISTINCT RTRIM(LTRIM(MACHNAME))
                 FROM GROUPS
                WHERE GROUPS.GROUPTYPE = 'M' 
                for xml path ('')
             ), 1, 2, '') as machineName
              FROM GROUPS
但是,错误在于:

FOR XML子句在视图、内联函数和派生函数中无效 表和子查询(当它们包含集合运算符时)。工作 使用派生表环绕包含集合运算符的SELECT 语法,并在其上应用XML

如果我这样做,它就起作用了:

select stuff((SELECT DISTINCT ', ' + RTRIM(LTRIM(MACHNAME)) FROM MACHS WHERE MACHID <> 0
for xml path ('')), 1, 2, '') as machineName
FROM MACHS
结果是:

WinMach1,WinMach2,WinMach3,WinMach4, WinMach5,WinMach6,WinMach7,WinMach8, WinMach9

我检查了这个:。但是,我无法理解修复方法

我试着: 但是,当我做第一部分时:

SELECT * FROM (SELECT DISTINCT RTRIM(LTRIM(MACHNAME))
  FROM MACHS
  WHERE MACHID <> 0

EXCEPT 

SELECT DISTINCT RTRIM(LTRIM(MACHNAME))
                 FROM GROUPS
                WHERE GROUPS.GROUPTYPE = 'M') AS K
错误为“未为“K”的第1列指定列名”

你能帮我吗

谢谢你的FROM条款。因此,您需要指定数据源-在本例中,它是K,但它应该是DS[K],表示数据源DS的别名,列为-K:

最后一个是这样的:

select stuff
(
    (
        SELECT DISTINCT ', ' + RTRIM(LTRIM(MACHNAME)) 
        FROM 
        (
            SELECT DISTINCT RTRIM(LTRIM(MACHNAME))
            FROM MACHS
            WHERE MACHID <> 0
            EXCEPT 
            SELECT DISTINCT RTRIM(LTRIM(MACHNAME))
            FROM GROUPS
            WHERE GROUPS.GROUPTYPE = 'M'
        ) DS (MACHNAME)
        for xml path ('')
    )
    ,1
    ,2
    , ''
) as machineName
我将使用“不存在”来代替:

select stuff( (select distinct ',' +rtrim(ltrim(m.MACHNAME))
               from MACHS m
               where MACHID <> 0 and
                     not exists (select 1 
                                 from GROUPS g 
                                 where g.MACHNAME = m.MACHNAME and 
                                       g.GROUPTYPE = 'M'
                                ) for xml path ('')
              ), 1, 1, ''
            ) as MachName
select stuff( (select distinct ',' +rtrim(ltrim(m.MACHNAME))
               from MACHS m
               where MACHID <> 0 and
                     not exists (select 1 
                                 from GROUPS g 
                                 where g.MACHNAME = m.MACHNAME and 
                                       g.GROUPTYPE = 'M'
                                ) for xml path ('')
              ), 1, 1, ''
            ) as MachName