代码之家  ›  专栏  ›  技术社区  ›  Phil

C SQL父子表选择查询帮助

  •  3
  • Phil  · 技术社区  · 17 年前

    我有两个表要从中获取数据。

    让我们称他们为“家长”和“孩子”。“父”表在“子”表中有许多记录。(一对多)

    我的问题是,我想找到一种有效的方法来显示这两个表包含的数据到我的ASP.NET MVC应用程序中。我的方法是从“父级”中选择所有记录,然后通过从“子级”中选择数据的每个记录进行循环。

    因此,我需要帮助设计一个针对SQL Server 05的查询,以便更有效地为C获取数据。我计划创建类型类,“父”类将有一个“列表”,在我的视图中,我可以循环输出值。

    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”
    4 回复  |  直到 17 年前
        1
  •  5
  •   andymeadows    17 年前

    我将一次提取所有数据,然后以编程方式运行它。

    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
    

    当你取回数据时,父母会重复,所以你需要过滤掉它。您可以通过LINQ提供父级比较或通过for循环来实现这一点。它通过折叠在唯一父级上的列表来创建,因为每个记录实际上都代表一个子级或无子级父级。

    关于Linq的“distinct”的信息是 available here .

        2
  •  2
  •   marc_s MisterSmith    17 年前

    好吧,您总是可以编写一个查询,它将返回两个表之间的联接:

      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 当然,你只能找回父母和他们的孩子记录——没有孩子的父母将被排除在外。如果您也需要这些(其子列设置为空),请使用 LEFT OUTER 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
    

    无论哪一个最适合你-选你的吧!

    马克

        3
  •  1
  •   Mark Redman    17 年前

    如果要存储和检索继承数据,可以在单个表中执行此操作,并查看SQL Server CTE表达式(CTE)。 这里的一个例子 http://msdn.microsoft.com/en-us/library/ms190766.aspx

        4
  •  1
  •   Community Mohan Dere    9 年前

    你不是很清楚地问了一个你刚刚提到的问题,我想这就是为什么有人投了反对票,但是一个评论会很好。如果您想知道要使用什么SQL签出,可以使用任何方法 Select Parent Record With All Children in SQL

    另一种方法(某些ORM使用)是进行两次选择。一个用于所有父级,一个用于所有子级,然后将它们联接到应用程序内存中,而不是数据库服务器上。