关于sql Server数据库使用的建议没有可用的数组?

时间:2011-03-01 01:44:56

标签: sql-server

我有以下要求,希望有人可以提供有关如何在SQL Server中完成此操作的一般准则:

用法

  1. 用户注册网站
  2. 然后我根据他们的位置匹配这些用户。因此,两个密切的用户匹配在一起。
  3. 匹配数量不明确,可能是一个区域内的0或1000个用户匹配
  4. 要求

    1. 对于每个用户,将所有匹配项放在一个记录中。由于SQL Server没有数组的概念,我该怎么做?对象可能?
    2. 稍后在网站中,我需要根据时间,距离等对特定用户的匹配进行排序。

3 个答案:

答案 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是'唯一'的方式。