【问题标题】:C# SQL parent child table select query helpC# SQL父子表选择查询帮助
【发布时间】:2009-08-16 14:46:15
【问题描述】:

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

让我们称他们为“父母”和“孩子”。 “Parent”表在“Children”表中有很多记录。 (一对多)

我的问题是我想找到一种有效的方法来将这两个表包含的数据显示到我的 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”

【问题讨论】:

  • 我认为这是一个合理的问题,有人给了它一个减号。我的想法是必须有比从“父”中选择所有记录然后在循环中查询“子”表以获取详细信息更好的方法。

标签: c# sql sql-server asp.net-mvc


【解决方案1】:

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

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】:

好吧,您始终可以编写一个查询,该查询将在两个表之间返回一个 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 连接行为)。

正如 cmets 中所指出的,如果您使用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

哪个最适合您 - 任君挑选!

马克

【讨论】:

  • INNER JOIN 假定父级总是有子级。
  • 我应该补充一点,考虑到提出的要求,这是一种同样有效的方法。
  • 是的,两者都是可能的——像往常一样“视情况而定”! :-) 关于实际要求(OP对此过于模糊)
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    您并没有真正明确地提出问题,您只是提到了一些想法,我认为这就是为什么有人投反对票但发表评论会很好。如果您想知道使用什么 SQL 的任何方式结帐Select Parent Record With All Children in SQL

    另一种方式(某些 ORM 使用)是进行两次选择。一个用于所有父母,一个用于所有孩子,然后将它们加入应用程序内存而不是数据库服务器。

    【讨论】:

      猜你喜欢
      • 2011-04-04
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      相关资源
      最近更新 更多