理想情况下,我需要一个等同于
的查询select * from customer where row_number() = 3
但这是非法的。
我无法使用自动增加的字段。
row_number()是需要选择的行。
我该怎么做?
编辑:嗯,我使用iSql * plus来练习,并且使用limit和auto_increment由于某种原因是非法的。我最终创建了一个序列和一个触发器,每当有一个条目时,我就将id加1。答案 0 :(得分:59)
您可以使用LIMIT 2,1
代替WHERE row_number() = 3
。
正如documentation所解释的那样,第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数。
请记住,它是一个基于0的索引。因此,如果您想要行号 n ,则第一个参数应为 n-1 。第二个参数将始终为 1 ,因为您只需要一行。例如,如果您想要表customer
的行号 56 :
SELECT * FROM customer LIMIT 55,1
答案 1 :(得分:5)
您不能选择这样的行。您必须指定值为3
的字段如果您要比较的字段为id
select * from customer where `id` = 3
答案 2 :(得分:3)
SET @customerID=0;
SELECT @customerID:=@customerID+1 AS customerID
FROM CUSTOMER ;
您可以像这样从SQL获取数据集并将其填充到java数据结构(如List)中,然后在那里进行必要的排序。 (可能借助类似的界面)
答案 3 :(得分:2)
您可以在表格中添加自动生成的ID字段,然后按此ID
进行选择SELECT * FROM CUSTOMER WHERE CUSTOMER_ID = 3;
答案 4 :(得分:2)
默认情况下不对SQL表进行排序,并且从非有序行集中请求第n行没有意义,因为除非您指定ORDER BY,否则每次都可能返回不同的行:
select * from customer order by id where row_number() = 3
(有时MySQL表显示内部订单,但您不能依赖此行为)。然后,您可以使用LIMIT offset, row_count
,基于0的偏移量,因此行号3变为偏移量2:
select * from customer order by id
limit 2, 1
或者您可以使用LIMIT row_count OFFSET offset
:
select * from customer order by id
limit 1 offset 2
答案 5 :(得分:1)
您的表格需要使用唯一ID字段创建,理想情况下该字段具有AUTO_INCREMENT属性。例如:
CREATE TABLE Persons
(
P_Id int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
PRIMARY KEY (P_Id)
)
然后您可以使用以下方式访问此表中的第3条记录:
SELECT * FROM Persons WHERE P_Id = 3