我在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解决方案(我想保留应用程序层之间的完全隔离)或者更适合数据表迭代?
提前致谢!!
答案 0 :(得分:0)
显然,它取决于当前数据库查询的结果集的长度(导致所有与用户相关的行的查询)。目前尚不清楚是否从表中删除了行。如果没有,您的解决方案不会扩展,因为匹配行的数量将永远增长。相反,如果您断言结果行的数量有一定界限(例如:用户可以同时打开的最大连接数),那么您的解决方案可能就足够了。