0

我在 SQL Server 2012 中有一个三表结构:人员、连接和消息。受影响的架构将是这样的:

人员:Id (pk bigint)、姓名...
连接:Id (pk bigint)、IdPpl1 fk、IdPpl2 fk
消息:Id (pk uniqueidentifier)、Idconnection (fk)、Messagetype (smallint)

在 Connections 表中,IdPpl1 和 IdPpl2 是人员 ID 的 fk。它可能碰巧出现在此表中,但交换了他们的列,例如“两个人”:

Id IdPpl1 IdPpl2  
.. ...... ......  
3     101    105  
8     105    101
9     101    106
10    106    101

上述情况是正确的。实际上,这些是表中这“两个人”的最大出现次数。

Messages 表保存了哪个“连接”发送了消息的信息。

Id IdConnection Messagetype
.. ............ ...........
24            3           1
25            8           1
26            3           2
27            8           2
28            9           3
29           10           2

注意:消息是单向的,这就是为什么连接表中可能有两行影响相同的两个人:在第一行,一个人是发送者,另一个是接收者,在第二行他们交换)

给定一个人员 ID,我需要一个 SQL 查询来显示“由相互连接的人相互发送的最少连接类型消息”和一个额外的列,指示消息类型是否匹配。对于People Id 101,结果应该是这样的:

Person_id Person_name IdConnection MatchingMsgType
......... ........... ............ ...............
      105        John            3               1 
      106       Peter            9               0 

由于 MsgId 24 和 25 出现第一行。与消息 26 和 27 对应的潜在行将不会出现,因为找到了先前匹配的消息类型。由于 MsgIds 28 和 29 出现第二行,将消息类型标记为不匹配。

目前,我得到了所有“与人相关的消息”,并在内存中遍历数据表排序、过滤和操作。

您会选择完整的 SQL 解决方案(我想保留应用层之间的完全隔离)还是更适合数据表迭代?

提前致谢!!

4

1 回答 1

0

显然,这取决于当前数据库查询的结果集的长度(产生与用户相关的所有行的那个)。目前尚不清楚是否曾经从您的表中删除行。如果没有,您的解决方案将无法扩展,因为匹配的行数将永远增长。相反,如果您可以断言结果行数有一定的界限(例如:用户可以同时打开的最大连接数),那么您的解决方案可能就足够了。

于 2013-01-21T14:51:16.680 回答