2012-02-05 81 views
6

我有一個查詢將返回一行。有什麼方法可以找到我查詢表的行索引時排序?獲取查詢的行號

我試過了rowid,但是當我期待第7排時得到了#582。

如:

CategoryID Name    
    I9GDS720K4 CatA 
    LPQTOR25XR CatB 
    EOQ215FT5_ CatC 
    K2OCS31WTM CatD 
    JV5FIYY4XC CatE 
--> C_L7761O2U CatF <-- I want this row (#5) 
    OU3XC6T19K CatG 
    L9YKCYAYMG CatH 
    XKWMQ7HREG CatI 

我已經試過用的rowid意外的結果:

SELECT rowid FROM Categories WHERE CategoryID = 'C_L7761O2U ORDER BY Name 

編輯:我也試過Ĵ庫珀的建議(見下文),但行號剛是不對的。

using (var cmd = conn.CreateCommand()) { 
     cmd.CommandText = string.Format(@"SELECT (SELECT COUNT(*) FROM Recipes AS t2    WHERE t2.RecipeID <= t1.RecipeID) AS row_Num 
       FROM Recipes AS t1 
       WHERE RecipeID = 'FB3XSAXRWD' 
       ORDER BY Name"; 
     cmd.Parameters.AddWithValue("@recipeId", id); 
     idx = Convert.ToInt32(cmd.ExecuteScalar()); 
+1

爲什麼要修改我的查詢'... WHERE t2.RecipeID <= t1.RecipeID'?在你的問題中,你所要求的行編號是關於'Name'而不是'RecipeID' - 這就是爲什麼你沒有得到好的結果,使用'WHERE t2.Name <= t1.Name'而不是 – 2012-02-08 22:06:02

回答

16

這裏是一個辦法讓sqlite的行號:

SELECT CategoryID, 
     Name, 
     (SELECT COUNT(*) 
     FROM mytable AS t2 
     WHERE t2.Name <= t1.Name) AS row_Num 
FROM mytable AS t1 
ORDER BY Name, CategoryID; 
+0

我覺得我'做錯事或缺少行爲怪癖。行號都是不同的,這取決於我使用的是哪個ID,但沒有一個是我所期望的。它可能與使用字符串(TEXT)作爲ID列有關嗎? – Echilon 2012-02-08 20:05:59

+0

爲什麼你將我的查詢修改爲'... WHERE t2.RecipeID <= t1.RecipeID'?在你的問題中,你要求的行號是'Name'而不是'RecipeID' - 這就是爲什麼你沒有得到好的結果,使用'WHERE t2.Name <= t1.Name'而不是 – 2012-02-08 22:06:28

+0

這工作正常,謝謝。關鍵是按照WHERE子句中的列進行排序。 – Echilon 2012-02-11 16:50:40

-3

你問什麼可以在兩種不同的方式來解釋,但我假設你要排序的生成表,然後根據排序對這些行進行編號。

declare @resultrow int 

select 
     @resultrow = row_number() OVER (ORDER BY Name Asc) as 'Row Number' 
from Categories WHERE CategoryID = 'C_L776102U' 

select @resultrow 
+1

row_number()在sqlite中不可用 – 2012-02-05 21:56:46

0

這是一個有趣的技巧,您可以在Spatialite中使用以獲取值的順序。如果使用帶有WHERE子句的count()函數來限制> =當前值,那麼計數實際上會給出順序。所以,如果我有一個名爲「mypoints」同列「價值」和「val_order」,然後點圖層:

SELECT value, (
SELECT count(*) FROM mypoints AS my 
WHERE my.value>=mypoints.value) AS val_order 
FROM mypoints 
ORDER BY value DESC; 

給出的值的降序排列。 我可以更新 「val_order」 一欄是這樣的:

UPDATE mypoints SET val_order = (
SELECT count(*) FROM mypoints AS my 
WHERE my.value>=mypoints.value 
);