理想的には、次と同等のクエリが必要です
select * from customer where row_number() = 3
しかし、それは違法です。
自動インクリメントフィールドを使用できません。
row_number()は、選択する必要がある行です。
これについてどうすればいいですか?
編集:まあ、私は練習にiSql * plusを使用していますが、limitとauto_incrementの使用は何らかの理由で違法です。最終的にシーケンスとトリガーを作成し、エントリがあるたびにidを1ずつ増やしました。
WHERE row_number() = 3
の代わりにLIMIT 2,1
を使用できます。
ドキュメント で説明されているように、最初の引数は返す最初の行のオフセットを指定し、2番目は返す行の最大数を指定します。
0ベースのインデックスであることに注意してください。したがって、行番号nが必要な場合、最初の引数はn-1。 2番目の引数は常に1になります。1行だけが必要なためです。たとえば、テーブルcustomer
の行番号56が必要な場合:
SELECT * FROM customer LIMIT 55,1
そのような行を選択することはできません。値がになるのフィールドを指定する必要があります
比較するフィールドがid
である場合に機能するクエリを次に示します。
select * from customer where `id` = 3
SET @customerID=0;
SELECT @customerID:=@customerID+1 AS customerID
FROM CUSTOMER ;
このようなSQLからデータセットを取得し、それをJavaデータ構造(リストなど)に入力し、そこで必要なソートを行うことができます(おそらく、同等のインターフェースの助けを借りて)
SQLテーブルはデフォルトでは順序付けられておらず、順序付けされていない行セットからn番目の行を要求しても意味がありません。ORDERBYを指定しない限り、毎回異なる行を返す可能性があるためです。
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
自動生成されたIDフィールドをテーブルに追加し、このIDで選択できます
SELECT * FROM CUSTOMER WHERE CUSTOMER_ID = 3;
理想的にはAUTO_INCREMENT属性を持つ一意のIDフィールドを使用して、テーブルを作成する必要があります。例:
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