2011-06-18 122 views
2

我有一個SQLite表,我需要添加一個包含SELECT指令給出的行位置的列。
SELECT指令包含兩個訂單子句。SQLite:添加包含行位置的列

如果它是不明確的,這裏有一個例子:
鑑於這樣的數據:

id  | c1  | c2 
=============================== 
a   | 1  | 2  
b   | 1  | 3  
c   | 1  | 1  
d   | 2  | 2  
e   | 2  | 3  
f   | 2  | 1  

而這個查詢:

SELECT * FROM table ORDER BY c1, c2 

我需要這個結果表:

id  | c1  | c2  | position 
========================================= 
a   | 1  | 2  | 2 
b   | 1  | 3  | 3 
c   | 1  | 1  | 1 
d   | 2  | 2  | 5 
e   | 2  | 3  | 6 
f   | 2  | 1  | 4 

我該怎麼辦?

重要說明: 這不是實際的數據,甚至不是實際的列。這只是一個例子。

+1

好,給出的數據特別是,你可以得到'position'值'(C1 - 1)* 3 + c2'。那會好嗎? –

+0

我沒有看到任何理由使用給定任何特定數據集的最小可能係數(3)。在最小值(有重疊/不正確排序的風險)和可能導致溢出的值之間的中間值的情況如何? –

回答

1

此查詢應該給你所有,你是字段後:

SELECT 
    (SELECT COUNT(0) 
    FROM MyTable T1 
    WHERE (T1.c1 * 1000) + T1.c2 <= (T2.c1 * 1000) + T2.c2 
    ) as 'position', 
    c1, 
    c2, 
    ID 
FROM 
    MyTable T2 
ORDER BY 
    (c1 * 1000) + c2 

現在,通過ID命令他們:

SELECT ID, c1, c2, position FROM 
    (SELECT 
    (SELECT COUNT(0) 
     FROM MyTable T1 
     WHERE (T1.c1 * 1000) + T1.c2 <= (T2.c1 * 1000) + T2.c2 
    ) as 'position', 
    c1, 
    c2, 
    ID 
    FROM 
    MyTable T2 
    ORDER BY 
    (c1 * 1000) + c2 
) T3 
ORDER BY ID 

注意

  • 如果內部Order By不起作用,則可以將中間結果轉儲到臨時表中,然後使用最終的Order By子句從臨時表中進行選擇。
  • 上面的「1000」是一個係數。你需要確保這個係數大於c2的最大值,但不能太高以至於得到整數溢出。

替代方法

可以插入與自動增量列的臨時表,然後從基於您想要的排序是臨時表中選擇值。

http://www.sqlite.org/autoinc.html

+1

+1提及臨時表和有趣的查詢:) –