[英]C# SQL parent child table select query help
我有兩個表要從中獲取數據。
讓我們稱他們為“父母”和“孩子”。 “父”表在“子”表中有許多記錄。 (一對多)
我的問題是我想找到一種有效的方法來顯示兩個表包含在我的ASP.NET MVC應用程序中的數據。 我的方法是從“Parent”中選擇所有記錄,然后遍歷每個記錄,從“Children”中選擇數據。
所以我需要幫助設計SQL Server 05的查詢,它可以更有效地獲取C#的數據,我計划創建類型類,“Parent”類將有一個“List”,在我的View中我可以循環輸出價值。
public class Parent_Type
{
public string Name { get; set; }
public List<Children_Type> Children { get; set; }
}
public class Children_Type
{
public string Name { get; set; }
}
數據需要顯示如下:(“父”記錄的名稱,然后是“子”記錄列表“)
“家長123”
“父母124”
我會立即提取所有數據,然后以編程方式運行它。
SELECT Parent.Id, Parent.Name FROM Parent
LEFT OUTER JOIN
SELECT Child.Id AS ChildId, Child.Name AS ChildName FROM Child
ON
Child.ParentId = Parent.Id
ORDER BY Parent.Name
當您獲得數據時,將重復父項,因此您需要對其進行過濾。 您可以通過提供父比較或通過for循環通過LINQ執行此操作。 Itereate通過列表折疊在唯一的父級上,因為每條記錄實際上代表一個孩子或無子女的父母。
有關LINQ“distinct”的信息,請點擊此處 。
好吧,你總是可以編寫一個查詢,它將在兩個表中返回一個JOIN:
SELECT Parent.ID, Parent.Field2, Parent.Field3,
Child.ID, Child.Value2, Child.Value3
FROM
Parent
INNER JOIN (or: LEFT OUTER JOIN)
Child ON Parent.ID = Child.ParentID
但是在這種情況下,你會得到一個“扁平”的行集,其中父元素的值對於每個子元素都是重復的(顯然是標准的SQL連接行為)。
正如評論中指出的那樣,如果你使用INNER JOIN
,當然,你只會收回父母和他們的孩子記錄 - 沒有孩子的父母將被排除在外。 如果你也想要那些(將其子列設置為NULL),請使用LEFT OUTER JOIN
而不是INNER JOIN
。
你的第二個選擇是有一個返回兩個結果的ADO.NET查詢,基本上就是這樣的
SELECT Parent.ID, Parent.FIeld2, Parent.Field3 ;
SELECT Child.ID, Child.ParentID, Child.Value2, Child.Value3;
但是你需要從響應中解析兩個結果集,將子記錄與他們各自的父母相關聯,並做更多的工作。
您的第三個選擇是在SQL Server中創建一個“FOR XML”查詢,該查詢將在單個XML文檔中返回XML文檔表示父級和子級記錄的層次結構。
SELECT
Parent.ID, Parent.Field2, Parent.Field3,
(SELECT
Child.ID, Child.Value2, Child.Value3
FROM Child
WHERE ParentID = Parent.ID FOR XML AUTO, TYPE, ELEMENTS)
FROM
Parent
FOR XML
AUTO, ROOT('Root'), ELEMENTS
無論哪種方式最適合您 - 請選擇!
渣
如果您希望存儲和檢索層次數據,可以在單個表中執行此操作,查看SQL Server CTE表達式(CTE)。 這里的一個例子http://msdn.microsoft.com/en-us/library/ms190766.aspx
你並沒有真正清楚地問過你剛才提到的一些問題,我認為這就是為什么有人投票但評論會很好。 如果您想知道要使用的SQL檢查的任何方法,請在SQL中選擇包含所有子項的父記錄
另一種方式(由一些ORM使用)是做兩個選擇。 一個用於所有父項,一個用於所有childeren,然后將它們連接到應用程序內存而不是數據庫服務器上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.