2014-01-20 143 views
0

我正在研究一個有趣的項目,我必須承認SQL不是我的強項。簡而言之,我的問題是這樣的:T-SQL-困難的邏輯查詢

假設一個表擁有共享特定關係的用戶對。 (例如(約翰,瑪麗,朋友),(瑪麗,愛麗絲,朋友)) 有沒有一種方法可以編寫一個查詢,以產生約翰的朋友的朋友,在這種情況下,愛麗絲,但也沒有返回瑪麗作爲結果?而且這樣的查詢可以擴展到任意n長度,因此排除中間用戶之後總會產生一組對。

同樣的: 一個會產生的查詢 - John與Alice有多少共同點? (在這種情況下,1)

或者 - 如果關係以同一人開始和結束(例如,約翰,瑪麗,愛麗絲,約翰 - 友誼),則有多少朋友屬於同一類型的關係。

如果帖子聽起來很愚蠢,我很抱歉 - 我知道我以前從來不必擔心SQL級別的這類事情,SQL主要用於插入,更新和檢索報表形式的數據。 動態查詢創建不是問題 - 我對查詢的體系結構邏輯更感興趣。 這是不同的,我不知道是否有辦法在SQL中,或者如果我應該嘗試在我的代碼的業務級別(例如使用.NET)做它

非常感謝。

+0

查找分層查詢。取決於RDBMS和版本,語法和功能會有所不同。在某些情況下,使用聯合和公用表表達式可以解決此問題,而在其他情況下,您無法在RDBMS中輕鬆完成必要的功能。 – xQbert

+0

我不得不承認我不確定你在問什麼......有很多問題隱藏在那裏。你應該在數據庫中做BL嗎?不可以。您是否應該使用它來獲得X的朋友,或者找到這些人之間的共同朋友?是。你會如何編寫這些查詢?這取決於你的模式和數據庫系統! – Liath

+0

對不起_我知道這可能會令人困惑。用簡單的英語思考它(它幫助我!)。我是喬治,愛麗絲是我的朋友。瑪麗是愛麗絲的朋友,但不是我的朋友。金是瑪麗的朋友,也是別人的朋友。如果我想找個朋友,朋友,朋友(在這種情況下是金)的人,我的第一個想法是動態查詢和多個連接。但是 - 這不會阻止連接加入前一對以及前一對。我怎麼能達到以下結果:George,Kim和其他什麼? –

回答

0

假設該表的結構:

TABLE [dbo].[Pers](
    [PersID] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [nvarchar](50) NOT NULL, 
CONSTRAINT [PK_Pers] PRIMARY KEY CLUSTERED 

對於人,並:

TABLE [dbo].[Rels](
    [RelID] [int] IDENTITY(1,1) NOT NULL, 
    [RelFrom] [int] NOT NULL, 
    [RelTo] [int] NOT NULL, 
CONSTRAINT [PK_Rels] PRIMARY KEY CLUSTERED 

的人(朋友)之間的關係。

而與此數據:

PersID Name 
1 John 
2 Mary 
3 Alice 

RelID RelFrom RelTo 
1 1 2 
2 2 3 

您可以使用此查詢:

select p.Name,frofr.Name 
from Pers as p 
    inner join Rels as f1 on f1.RelFrom=p.PersID 
    inner join Rels as f2 on f2.RelFrom=f1.Relto 
    inner join Pers as frofr on frofr.PersID=f2.RelTo 

有了這樣的結果:

Name Name 
John Alice 

,只要你想你可以創建儘可能多的關係,但是對於每個級別,您應該擴展查詢。 您可以爲每個「朋友級」創建視圖。 我不會將它用於100K +記錄,對於這種情況,您可能更適合構建樹狀結構。

+0

輝煌。這絕對是我爲表設計的正確方向邁出的一步。我會將您的答案標記爲正確,並且一定會在您找到更多問題之後再打擾您。謝謝 !但是,關係也可以是多方向的。意思,用你的桌子,約翰是瑪麗的朋友。但瑪麗也是約翰的朋友。我最初的想法是使用'WHERE ...不等於...'來停止回溯。 –

+0

我僅以relfrom和relto爲例。你也可以將它看作是左/右或r1/r2。這只是爲了說明這兩個人之間有關係。 通過這種設置,您可以非常靈活,因爲您的結構非常基礎。你可以添加一個關係類型列來指示關係的類型:朋友,父母,老闆等...... 並且在這個設置中,如果瑪麗不再是愛麗絲的朋友,約翰自動不會是愛麗絲的朋友的朋友。 我想你不是在構建LinkedIn克隆:) – MarcelDevG