簡體   English   中英

C#SQL父子表選擇查詢幫助

[英]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”

  • “孩子1”
  • “孩子2”
  • “孩子3”

“父母124”

  • “孩子1”
  • “孩子2”
  • “孩子3”

我會立即提取所有數據,然后以編程方式運行它。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM