2008-12-16 60 views
0
select Table1.colID, Table1.colName, 
(select * from Table2 where Table2.colID = Table1.colID) as NestedRows 
from Table1 

上面的查询给你这个错误: 子查询返回的值超过1。这是不允许的,当子查询遵循=,!=,<,< =,>,> =或当子查询被使用时.....嵌套的记录是sql服务器

任何人都可以解释为什么这个限制存在?

我有这种想法,这种多维的查询将是构建面向对象从数据库查询1

编辑对象直接不错:

这个问题是相当的理论。为了解决这个问题,我会使用一个连接或简单地完成2个查询,但我想知道是否有任何东西阻止你返回一个表作为表类型(在sql server 2008中,你可以创建表类型)。

说你在代码corrensponding类,认为LINQ2SQL

public class Table1 
{ 
    public int colID, 
    public string colName, 
    public List<Table2> table2s; 
} 

我希望能够填补这一类的实例直接与1个查询

回答

0

你会过得更好使用INNER JOIN在两个表之间,并简单地从每个表中选择所需的行。

SELECT tab1.colID, tab1.colName, tab2.Column1, tab2.column2 
FROM dbo.Table1 AS tab1 
    INNER JOIN dbo.Table2 AS tab2 
     ON tab1.colID = tab2.colID 

但是,请记住table1中的数据将针对table2中的每个匹配记录重复。虽然我相信我发布的查询会以您正在查找的格式获取数据,但我认为这不是查询数据库的最佳方法。我要么执行单独的查询,要么将单独的查询放入存储过程并返回多个结果集。

+0

如果您确实只需要一行,则需要使用GROUP BY子句和合适的聚合函数,或者使用原始子查询(以及合适的ORDER BY子句)使用TOP 1。 – 2008-12-16 15:09:14

+0

但这听起来不像他只想要一行。据我所知,他的确需要Table2中的多行。我也假定表1包含colID的主键。 – NYSystemsAnalyst 2008-12-16 15:17:35

2

因为select子句中的子查询必须“插入”来自外部查询的结果集的每一行中的列值。您不能将一组值放入结果集的单个单元格中(单行的单个列)。

您需要使用内部连接。连接表返回的多行将作为最终结果集中的多行输出。

+0

如果您有一个类型表的列,该怎么办?在sql server 2008中,你可以定义表 – terjetyl 2008-12-16 15:08:04

0

我想你要找的查询可能是:

select Table1.colID, Table1.colName,Table2.* 
from Table1 inner join Table2 ON Table1.colID = Table2.colID 

子查询更典型的WHERE子句中使用(至少我)。

3

看起来好像您希望Table1中的每一行从Table2返回的记录集(多列和多行)。如果这是正确的,也许你可以从数据库返回XML格式的数据。像这样的东西...

select Table1.colID, Table1.colName, Table2.* 
from Table1 
     Inner Join Table2 
     On Table1.ColId = Table2.ColId 
Order By Table1.ColId 
For XML Auto 

然后,对于表1中的每一行,您将在您的XML中为table2数据获取多个子节点。

从数据库返回XML以及在前端加载数据结构可能会有性能影响。我不一定建议这是最好的方法,但它可能是值得研究的。