我有一个SQL查询,它返回一组行:
SELECT id, name FROM users where group = 2
我还需要包含一个具有递增整数值的列,因此第一行需要在计数器列中为1,第二行为2,第三行为3等
这里显示的查询只是一个简化的例子,实际上查询可能是任意复杂的,有几个连接和嵌套查询。
我知道这可以使用带有自动编号字段的临时表来实现,但有没有办法在查询本身内完成?
答案 0 :(得分:26)
对于初学者来说,有些东西:
SELECT my_first_column, my_second_column,
ROW_NUMBER() OVER (ORDER BY my_order_column) AS Row_Counter
FROM my_table
但是,重要的是要注意ROW_NUMBER() OVER (ORDER BY ...)
构造仅确定Row_Counter
的值,但不保证结果的排序。
除非SELECT
本身具有明确的ORDER BY
子句,否则结果可以按任何顺序返回,具体取决于SQL Server如何决定优化查询。 (See this article for more info。)
保证结果始终以Row_Counter
顺序返回的唯一方法是对SELECT
和{{1}应用完全相同的排序}:
ROW_NUMBER()
上面的模式将始终以正确的顺序返回结果,并且适用于简单查询,但是SELECT my_first_column, my_second_column,
ROW_NUMBER() OVER (ORDER BY my_order_column) AS Row_Counter
FROM my_table
ORDER BY my_order_column -- exact copy of the ordering used for Row_Counter
子句中可能有几十个表达式的“任意复杂”查询呢?在那些情况下,我更喜欢这样的东西:
ORDER BY
使用嵌套查询意味着不需要复制复杂的SELECT t.*
FROM
(
SELECT my_first_column, my_second_column,
ROW_NUMBER() OVER (ORDER BY ...) AS Row_Counter -- complex ordering
FROM my_table
) AS t
ORDER BY t.Row_Counter
子句,这意味着更少的混乱和更容易的维护。外部ORDER BY
也使查询的目的更加清晰。
答案 1 :(得分:10)
在SQL Server 2005及更高版本中,您可以使用ROW_NUMBER()
函数,该函数具有排序顺序选项以及计数完成(和重置)的组。
答案 2 :(得分:2)
最简单的方法是使用变量行计数器。但是它将是两个实际的SQL命令。一个设置变量,然后查询如下:
SET @n=0;
SELECT @n:=@n+1, a.* FROM tablename a
您的查询可能与连接等一样复杂。我通常将其作为存储过程。您可以使用变量获得各种乐趣,甚至可以使用它来计算字段值。关键是:=
答案 3 :(得分:-3)
这是一种不同的方法。 如果您有几个不可连接的数据表,或者由于某种原因您不想同时计算所有行,但仍希望它们与同一行数相同,则可以创建一个表来完成工作对你而言。
示例:
import GameplayKit
import UIKit
class guessViewController: UIViewController {
@IBOutlet weak var button1: UIButton!
@IBOutlet weak var button2: UIButton!
@IBOutlet weak var button3: UIButton!
@IBOutlet weak var button4: UIButton!
var cards = [String]()
var score = 0
var correctAnswer = 0
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
cards += ["boots", "tired", "heart", "angry", "leaf", "sleepy", "apple", "chestnuts", "pumpkin", "rainbow"]
askQuestion()
//cards = GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(cards) as! [String]
}
func askQuestion() {
button1.setImage(UIImage(named: cards[0]), forState: .Normal)
button2.setImage(UIImage(named: cards[1]), forState: .Normal)
button3.setImage(UIImage(named: cards[2]), forState: .Normal)
//title = cards[correctAnswer].uppercaseString
}
@IBAction func buttonTapped(sender: UIButton) {
if sender.tag == correctAnswer {
score++
print("correct")
} else {
score--
print("incorrect")
}
}
}