将多个字段连接到一个字段并在SQL

时间:2016-09-15 05:14:34

标签: sql sql-server substring

我有一个表GeoTable,我需要在其上执行特定的操作。

该表有两个我感兴趣的主要字段。由于这是一个映射项目,因此存在Geo字段(varchar(max)描述纬度和经度字符串中位置的几何) ,以及ID字段(这是一个bigint)。

但是,多个ID可以具有相同的Geo(例如,一个地方本可以多次出售),我需要一个查询将它们组合在一起并告诉我每个Geo有哪些ID。所以,例如:

Geo                                             IDs
(My big Geometry string here)                   1
(My big Geometry string here)                   2
(My big Geometry string here)                   3
(My big Geometry string here)                   4
(My big Geometry string here)                   5
(My other big Geometry string here)             6
(My other big Geometry string here)             7
(My other big Geometry string here)             8

......变成......

Geo                                             IDs
(My big Geometry string here)                   1,2,3,4,5,
(My other big Geometry string here)             6,7,8,

我在这里有一些基本上我需要的代码,但它的运行速度非常慢(我一次会获取大约20000条记录,但是通过一个人们期望它立即在网站上在线): / p>

SELECT DISTINCT Geo, (
        SELECT ','+LEFT(CAST(G2.Id AS NVARCHAR),11) AS [text()]
        From dbo.GeoTable G2
        Where G2.Geo = GeoTable.Geo
        ORDER BY Id
        For XML PATH ('')
    ) [IDs]
FROM            GeoTable

抱歉,还应该提到我正在使用MS SQL Server,因此没有GROUP_CONCAT。

3 个答案:

答案 0 :(得分:1)

这应该有效:

WITH Src AS
(
    SELECT * FROM (VALUES
    ('My big Geometry string here)      ', 1),
    ('My big Geometry string here)      ', 2),
    ('My big Geometry string here)      ', 3),
    ('My big Geometry string here)      ', 4),
    ('My big Geometry string here)      ', 5),
    ('My other big Geometry string here)', 6),
    ('My other big Geometry string here)', 7),
    ('My other big Geometry string here)', 8)
    ) T(Geo, ID)
)
SELECT DISTINCT Geo, IDs
FROM Src S
CROSS APPLY (SELECT STUFF((SELECT ','+CONVERT(varchar(10),S2.ID)
                           FROM Src S2
                           WHERE S.Geo=S2.Geo
                           FOR XML PATH('')),1,1,'')) T(IDs)

<强>结果

Geo                                 IDs
-------------                       ----------
My big Geometry string here)        1,2,3,4,5
My other big Geometry string here)  6,7,8

答案 1 :(得分:1)

答案 2 :(得分:0)

您始终可以使用变量来存储每个字符串的出现次数,并使用distinct子句

仅显示一次