SQLite:添加包含行位置的列

时间:2011-06-18 16:22:52

标签: sql sqlite

我有一个SQLite表,我需要添加一个包含SELECT指令给出的行位置的列。
SELECT指令包含两个ord​​er子句。

如果不清楚,这是一个例子:
鉴于此数据:

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 个答案:

答案 0 :(得分: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的最大值,但不要太高以至于您得到整数溢出。

替代方法

您可以使用AutoIncrement列插入临时表,然后根据所需的顺序从该临时表中选择值。

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