我有以下要求,希望有人可以提供有关如何在SQL Server中完成此操作的一般准则:
答案 0 :(得分:2)
您的基本假设是错误的!
SQL确实有数组。实际上所有 SQL都是数组;因为表是一个数组。
让我解释一下。数组是一系列值。表也是一系列值(如果有一个提供序列信息的列,则为一个顺序。)
对于您的示例,我们假设您有一个用户表。
UserID, UserName
在此表中,每行代表一个用户。您不希望有两行具有相同的userID
您可以通过创建另一个表(他们接近的用户数组)来将每个用户与一个用户数组“关联”。
UserID, NearUserID, [Distance]
在这种情况下,此表将具有多个具有相同UserID的行。这会创建您的数组。如果您想要订购,可以添加序列或订单列。
以下是一些SQL看起来如何看待每个用户及其所有NearUsers:
SELECT *
FROM Users
JOIN NearUsers ON Users.UserID = NearUsers.NearUserID
希望这有帮助。
让我们假设您希望将记录减半(请参阅注释),并在两个方向上将用户放在一起
UserID1, UserID2
然后上面的SQL可以改为
SELECT Users.UserID, COALESCE(U1.UserID2,U2.UserID1) AS NearUser
FROM Users
JOIN UsersNear U1 ON Users.UserID = UserID1
JOIN UsersNear U2 ON Users.UserID = UserID2
这个会更小(你不是为每个用户存储一个数组,只是关系),而且比为每个用户创建一个数组更有效。
答案 1 :(得分:0)
如果您的要求是真实的,那么唯一的方法是使用包含所有匹配项的XML列,或者可能包含所有匹配项的逗号分隔列表。
您可能想要找出为什么要求想要在一行中的所有匹配。调用者将如何使用一行中的所有匹配项?
答案 2 :(得分:0)
您对“关闭”用户的定义是什么?郊区,邮政编码,城市????
1)如果是上述之一,你就会使整个过程变得复杂,因为你要做的就是选择[zip,city,suburb,...] ='X'的所有用户,然后你可以做一些@Paul Sasik建议的内容并将它们插入一个单独的表中,或者只是创建一个视图或存储过程,以便在需要时为您检索它们
2)您几乎需要另一个表(或规则)来定义接近度在时间,距离等方面的含义,并且有办法查找它并比较记录。完成后,您可以创建可在查询中使用的用户定义函数。
@John S,我不同意XML是'唯一'的方式。