Saya ingin menggunakan sintaks oracle untuk memilih hanya 1 baris dari tabel DUAL
. Misalnya, saya ingin menjalankan kueri ini:
SELECT user
FROM DUAL
... dan itu akan memiliki, seperti, 40 rekaman. Tapi saya hanya butuh satu catatan. ... DAN, saya ingin mewujudkannya tanpa WHERE
klausul.
Saya butuh sesuatu di bidang nama_tabel seperti:
SELECT FirstRow(user)
FROM DUAL
dual
?dual
adalah tabel sistem di oracleDUAL
. Ini seperti#define TRUE 0
di C - tentu, ini mungkin berhasil untuk Anda, tetapi pengembang masa depan akan membenci Anda.select user from dual
? Jika tidak, silakan coba, dan lihat apa yang Anda dapatkan. Pada sistem oracle standar, Anda akan mendapatkan kembali pengguna yang Anda gunakan untuk menjalankan perintah.Jawaban:
Anda menggunakan ROWNUM.
yaitu.
http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm
sumber
order by
.ORDER BY
diterapkan setelahWHERE
.SELECT * FROM (SELECT user FROM Employees ORDER BY SALARY DESC) WHERE ROWNUM <= 10
Saya menemukan "solusi" ini tersembunyi di salah satu komentar. Karena saya mencarinya sebentar, saya ingin menyoroti sedikit (belum bisa berkomentar atau melakukan hal semacam itu ...), jadi inilah yang saya gunakan:
Ini akan mencetak saya entri [Kolom] yang diinginkan dari entri terbaru dalam tabel, dengan asumsi [Tanggal] selalu dimasukkan melalui SYSDATE.
sumber
ROWID
, selama Anda tidak pernah menghapus catatan apa pun dan selalu peduli dengan yang terakhir dimasukkan / dimodifikasi.ROWID
dimodifikasi secara acak oleh Oracle. Tidak. Ini didasarkan pada benar-benar memodifikasi baris, yaitu Anda menghapus satu, lalu menyisipkan satu. Yang dimasukkan akan mendapatkan yang lamaROWID
. Ada hal-hal seperti tabel statis yang tidak pernah diperbarui-seperti negara bagian di AS adalah contoh yang baik-di mana jika berubah, mungkin akan memiliki dampak lain, bagaimanapun, ketika ini baik-baik saja.ROWID
dapat diubah, DBA yang baik akan mencarinya dan melakukan apa yang mereka bisa untuk menghindarinya jika ada kemungkinan mereka mempengaruhi tabel statis seperti yang saya jelaskan itu hanya aplikasi yang harus dioperasikan. Ekspor tabel dapat dilakukan denganSELECT
pernyataan. Impor akan terjadi sekali dan tidak akan pernah lagi. Saya mengerti maksud Anda, perhatian pasti dibutuhkan, tetapi masalahnya jauh dari tidak dapat dihindari.Sintaks ini tersedia di Oracle 12c:
^^ Saya hanya ingin menunjukkan bahwa baik baris atau baris (jamak) dapat digunakan terlepas dari pluralitas jumlah baris yang diinginkan.)
sumber
kami memiliki 3 pilihan untuk mendapatkan baris pertama dalam tabel Oracle DB.
1)
select * from table_name where rownum= 1
adalah cara terbaik2)
select * from table_name where id = ( select min(id) from table_name)
3)
sumber
Sejauh yang saya tahu,
dual
tabel di Oracle adalah tabel khusus dengan hanya satu baris. Jadi, ini sudah cukup:sumber
👌 Jawabannya adalah:
Anda harus menggunakan kueri bersarang sebagai:
=> Dalam PL / SQL "ROWNUM = 1" TIDAK sama dengan "TOP 1" dari TSQL.
Jadi, Anda tidak dapat menggunakan kueri seperti ini: "pilih * dari any_table_x di mana rownum = 1 pesanan oleh any_column_x;" Karena oracle mendapat baris pertama maka berlaku order by clause.
sumber
rownum = 1
, tetapi kita tidak boleh membiarkan bug lama memengaruhi kode kita lagi.Tidak ada
limit 1
kondisi (itu MySQL / PostgresSQL) di Oracle, Anda perlu menentukanwhere rownum = 1
.sumber
"FirstRow" Adalah batasan dan oleh karena itu ditempatkan di
where
klausa bukan diselect
klausa. Dan itu disebut rownumsumber
ORDER BY
, karena pengurutan hanya terjadi setelah klausa where. Dengan kata lain, untuk mendapatkan urutan teratas dari kueri yang diurutkan tertentu, rownum sama sekali tidak berguna.Where
dengan kueri View.SELECT * FROM (SELECT * FROM ... WHERE ... ORDER BY ...) WHERE ROWNUM = 1
? Yah, itu mungkin berhasil, tapi kelihatannya cukup bodoh, tbh.Jika ada baris yang cocok, coba:
Tidak ada klausul di mana.
sumber
sumber
select a.user from (select user from users order by user) a where rownum = 1
akan melakukan yang terbaik, opsi lainnya adalah:
dalam skenario di mana Anda menginginkan subset yang berbeda, tetapi saya rasa Anda juga bisa menggunakan
RANK()
Tapi, saya juga sukarow_number()
over(...)
karena tidak diperlukan pengelompokan.sumber
Jika Anda ingin mendapatkan kembali hanya baris pertama dari hasil yang diurutkan dengan subkueri paling sedikit, coba ini:
sumber
Lebih fleksibel daripada
select max()
:sumber