2016-03-30 95 views
1

在C#中,可以有下面的代碼:會是什麼.SelectMany(X => X)是SQL

string[][] Stuff = new string[] { new string[] {"1", "2", "3"}, new string[] {"4", "5", "6"} }; 
string[] OneList = Stuff.SelectMany(x => x).ToArray(); 

所以我想知道,怎麼能同是SQL做了什麼?

在表格中(表1 |表2):

| 1 | 4 |
| 2 | 5 |
| 3 | 6 |

結束結果(表的結果在同一列1 & 2):

| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |

所以這可以做到不使用臨時表?

是否有可能在一個簡單的SQL語句中做到這一點?

+2

你的數據源是什麼樣的? 'SelectMany'用於「拼合」一系列集合,所以它可能在SQL中是可能的,但它依賴於表結構。沒有一個特定的函數或操作符能夠在SQL中完成這一功能。 –

+0

@DStanley:我已經重新添加了代碼片段註釋,因爲OP顯然使用它們來創建示例表。 (雖然ASCII表格可能更適合這個目的。) – Heinzi

+0

@Heinzi好的,我沒有意識到你可以使用代碼片段來生成HTML表格。不過,同意ASCII表格會更有效。 –

回答

1

由於SQL Server不支持「嵌套」結果集,因此「展平」它們也沒有意義。

你的C#示例需要兩個列表,將它們包裝起來,然後將它們弄平。這其實可以寫成一個簡單的串聯:

string[] OneList = Stuff[0].Concat(Stuff[1]).ToArray(); 

此操作---串聯的結果集--- SQL Server支持。您可以使用UNION ALL

SELECT column1 FROM table1 
UNION ALL 
SELECT column1 FROM table2 
ORDER BY column1 

注:

  • UNION ALL不斷重複,UNION過濾它們。

  • 如果column1table2不同的名稱,您ORDER BY子句必須從第一SELECT子句中使用的列名。

+0

'UNION ALL'更像'.Concat(...)'。 '.SelectMany(...)'更多'CROSS JOIN' /'CROSS APPLY' –

+0

@MatthewWhited:我不認爲有直接的等價物,因爲SQL Server不支持嵌套記錄集。我添加了一個註釋,這只是給出具體示例的解決方案。 – Heinzi

+0

確實如此,但距離更近,'.Concat'將成爲EF的「UNION ALL」。 –