复杂的SQL查询与数据表迭代和处理

时间:2013-01-21 14:39:28

标签: sql sql-server-2012

我在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。它可能碰巧在这个表中出现相同的“两个人”,但交换他们的专栏,E.G:

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

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

“消息”表包含“连接”发送消息的信息。

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

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

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

,结果应如下所示
Person_id Person_name IdConnection MatchingMsgType
......... ........... ............ ...............
      105        John            3               1 
      106       Peter            9               0 

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

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

您是否会使用完整的SQL解决方案(我想保留应用程序层之间的完全隔离)或者更适合数据表迭代?

提前致谢!!

1 个答案:

答案 0 :(得分:0)

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