我有两个表要从中获取数据。
让我们称他们为“父母”和“儿童”。 “父”表在“子”表中有许多记录。 (一对多)
我的问题是我想找到一种有效的方法来显示两个表包含在我的ASP.NET MVC应用程序中的数据。我的方法是从“父”中选择所有记录,然后循环选择“儿童”中的数据。
所以我需要帮助设计SQL Server 05的查询,它可以更有效地获取C#的数据,我计划创建类型类,而“Parent”类将有一个“List”,在我的视图中我可以循环输出值。
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”
答案 0 :(得分:5)
我会立即提取所有数据,然后以编程方式运行它。
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”的信息是available here。
答案 1 :(得分: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连接行为)。
正如评论中指出的那样,如果您使用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
无论哪种方式最适合您 - 请选择!
马克
答案 2 :(得分:1)
如果您希望存储和检索分层数据,可以在单个表中执行此操作,查看SQL Server CTE表达式(CTE)。 这里有一个例子http://msdn.microsoft.com/en-us/library/ms190766.aspx
答案 3 :(得分:1)
你并没有真正清楚地提出一个问题,你刚才提到了一些想法,我认为这就是为什么有人投票但评论会很好。如果您想知道哪些SQL使用checkout Select Parent Record With All Children in SQL
,可以采用任何方式另一种方式(由一些ORM使用)是做两个选择。一个用于所有父项,一个用于所有childeren,然后将它们连接到应用程序内存而不是数据库服务器上。