SQL Server:将行连接到一行而不使用子查询

时间:2018-05-07 14:38:27

标签: sql sql-server sql-server-2012

声明表

| id |
+----+
| 1  |
| 2  |

冲突表

| declarationId | title  |
+---------------+--------+
| 1             | qqq    |
| 1             | wwww   |
| 2             | ttttt  |

使用子查询

进行查询
SELECT 
    dd.[Id],
    (SELECT ',' + Title 
     FROM [dbo].[Conflicts] cc 
     WHERE cc.DeclarationId = dd.Id 
     FOR XML PATH(''))
FROM 
    [dbo].[Declarations] dd

结果

| 1  | ,qqq,wwww, |
| 2  | ,ttttt,    |

如何在没有子查询的情况下实现相同的结果?

我想使用全文索引创建视图,但是无法使用子查询在视图上创建索引。

3 个答案:

答案 0 :(得分:0)

如果没有子查询,您无法在SQL Server 2012中执行此操作,尽管Gordon指出,您可以在用户定义的函数中隐藏子查询。但是,我怀疑这样做不会达到你能够用全文索引创建视图的目的,所以我认为你需要找到另一种方法来做你想做的事情,不管是什么。

答案 1 :(得分:0)

 WITH CTE_TableName AS 
 (
    SELECT DeclarationId, Title
      FROM Conflicts 
  )
 SELECT t0.DeclarationId
        ,STUFF((
        SELECT ',' + t1.Title
          FROM CTE_TableName t1
         WHERE t1.DeclarationId = t0.DeclarationId
        ORDER BY t1.Title
        FOR XML PATH('')), 1, LEN(','), '') AS Titles
  FROM CTE_TableName t0
 GROUP BY t0.DeclarationId
 ORDER BY DeclarationId;

答案 2 :(得分:0)

在不使用子查询的情况下创建连接或选择的最佳选择是创建用户定义的函数,如前所述。

创建用户定义的函数,如下所示:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION AppendString()
RETURNS varchar(100)
AS
BEGIN
    DECLARE @temp VARCHAR(50);

    SELECT @temp = ',' + Title 
    FROM [dbo].[Conflicts] cc 
    WHERE cc.DeclarationId = dd.Id 
    FOR XML PATH('')

    RETURN @temp
END
GO

然后使用连接语句中的函数

SELECT 
    dd.Id, AppendString AS Title 
FROM 
    Declarations DD
INNER JOIN 
    Conflicts CC ON DD.Id = CC.declarationId