2013-01-21 141 views
0

我在SQL Server 2012中有三個表結構:人員,連接和消息。受影響的架構會是這樣的:複雜的SQL查詢與數據表迭代和處理

人民:ID(PK BIGINT),名稱...
連接:ID(PK BIGINT),IdPpl1 FK,IdPpl2 FK
消息:身份證(pk uniqueidentifier),Idconnection(fk),Messagetype(smallint)

在Connections表上,IdPpl1和IdPpl2是fk的人Id。它可能發生在相同的「兩個人」出現在該表中,但他們交換柱,E.G:

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 

注:消息是單向的,這就是爲什麼有可能是影響相同的兩個人的聯繫表中的兩行:第一行上,一個人是發送者和其他接收者,在第二排他們交換)

鑑於人民身份證,我需要一個SQL查詢來顯示「最少連接類型消息互相連接的人互相發送」和一個額外的指示,如果消息類型匹配或不。結果應該是這樣的,爲人編號101:

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

第一行出現由於MsgIds 24和25的電勢與行消息26和27對應的將不會出現,因爲先前的匹配爲messageType被找到。 由於MsgIds 28和29,出現第二行,將消息類型標記爲不匹配。

當前,我得到所有「與一個人有關的消息」並遍歷數據表格排序,過濾和操作內存。

你會用一個完整的SQL解決方案(我想保留應用程序層之間的完全隔離)還是更適合數據表迭代?

在此先感謝!

回答

0

顯然它取決於您當前數據庫查詢的結果集的長度(導致與用戶相關的所有行的結果集)。目前還不清楚行是否從您的表中刪除。如果沒有,您的解決方案不會擴展,因爲匹配行的數量將永遠增長。相反,如果您可以聲明結果行數有一定的限制(例如:用戶可以同時打開的最大連接數),那麼您的解決方案可能就足夠了。

+0

感謝您的輸入@ manu-fatto:在最壞的情況下行數不應超過300行,否則:行不會被刪除! – jonayreyes