2013-08-01 39 views
2

我有一個表,如下所示的ID,分別獲得行基於在SQL

TypeID Name   Date 
------------------------------- 
1  Carrot 1-1-2013 
1  Beetroot 1-1-2013 
1  Beans  1-1-2013 
2  cabbage 1-1-2013 
2  potato 1-1-2013 
2  tomato 1-1-2013 
2  onion  1-1-2013 

如果需要2行,那麼它應該從TYPEID 2.如果返回從TYPEID 1 2行2列需要只有4行,意味着我必須從TypeId 1中獲得4行,並且從TypeId 2中獲得4行2 ,但TypeId 1只有3行,因此我們只需要獲得typeId的3行1

如何做到這一點?我應該添加RowNumber嗎?

+0

如果你需要什麼4行 –

+0

總是3元TYPEID,或只是「你可以抓住從最低到最高的類型」 ? –

+0

你是否總是從'TypeId 1'獲取所有行?例如,如果只需要3行,你是否從'TypeId 1'得到所有三行,而從'TypeId 2'沒有? –

回答

1

你可以編寫你的查詢按TypeID排序。然後,如果您使用SQL,則可以使用SELECT TOP NLIMIT N(取決於數據庫),或者使用TSQL和SQL Server,使用TOP(N)取前N行。

如果您使用的是C#代碼中的基於LINQ的ORM,則可以使用Take(N),它會根據提供者詳細信息自動創建適當的查詢,以限制結果數量。

0

我認爲你應該使用查詢來從類型1中選擇3行.....然後從類型2中選擇多個行然後將結果添加到一起。

+0

這是相當低效的,因爲它會多次到數據庫。在大多數情況下,最好在單個查詢中完成。 –

2

對於SQL Server;

編輯:你的問題稍有改變;

如果您想每個類別最多需要x個項目,您可以使用ROW_NUMBER();

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY TypeID ORDER BY Name) rn FROM Table1 
) 
SELECT TypeID, Name, [Date] FROM cte 
WHERE rn <=3  -- here is where your x goes 
ORDER BY TypeID; 

An SQLfiddle to test with

+0

爲什麼在第二個查詢中需要「TOP 8」? – Greg

+0

我不認爲在第二個查詢中指定'TOP N'是滿足OP的要求(通過我的理解)。 – Greg

+0

@Greg你是對的,我沒有看到問題的編輯。更新。 –

0
;With CTE(TypeID,Name,Date,RowNo) 
AS 
(
select *, ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ID) from TableVEG 
) 
Select Top(@noofRows*2) * from CTE where RowNo<[email protected] order by rowno 

上面的查詢工作..謝謝ü所有... :-)