我有一个表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。
答案 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)
我认为你需要group_concat
点击这里
答案 2 :(得分:0)
您始终可以使用变量来存储每个字符串的出现次数,并使用distinct子句
仅显示一次