2008-12-16 128 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以及在前端加載數據結構可能會有性能影響。我不一定建議這是最好的方法,但它可能是值得研究的。