希望你能帮忙......
我有两个SQL表,一个有用户,另一个有我需要组合成C#数据表的用户位置。
加入它们的基本查询不是问题,问题是用户可能会多次出现在位置表中。在这种情况下,我需要将每个位置传递到一行,而不是多次向多个位置列出用户。
它是ADO.NET邻近搜索的一部分,因此当前查询代表...
DECLARE @lat float
DECLARE @lon float
SET @lat = @varLat
SET @lon = @varLon
DECLARE @point geography = geography::Point(@lat, @lon, 4326);
DECLARE @distance float
SET @distance = @varDistance
SELECT t1.locationId, t1.city, t2.[firstName]+' '+[lastName] as name
FROM _Locations t1 INNER JOIN _Users t2 ON t2.userId = t1.userId
WHERE @point.STDistance(centerPoint) <= @distance
我觉得LINQ可能有所帮助,但它不是我以前用过的东西。
答案 0 :(得分:2)
实际上没有足够的信息可以给你正确答案。它可以在sql或代码中完成。这就是T-SQL方式。
SELECT u.ID, u.Name,
stuff(
(select ', ' + ul.ID from UserLocations where ul.UserID = u.ID for xml path('')),
1, 2, null) locs
FROM Users u
UPD:
SELECT t2.[firstName]+' '+[lastName] as name,
STUFF(
(SELECT t1.locationId, t1.city FROM _Locations t1
WHERE t1.userId = t2.userId
AND @point.STDistance(centerPoint) <= @distance FOR XML PATH('')),
1, 2, NULL) locs
FROM _Users t2
答案 1 :(得分:0)
最终工作查询是......
SELECT t2.[firstName]+' '+[lastName] as name,
STUFF(
(
SELECT ', ' + t1.city FROM _Locations t1
WHERE t1.userId = t2.userId
AND @point.STDistance(centerPoint) <= @distance FOR XML PATH(''), type
).value('.', 'varchar(max)'), 1, 1, ''
)
FROM _Users t2