คำตอบ:
หากคุณต้องการเพียงแถวแรกที่เลือกคุณสามารถ:
select fname from MyTbl where rownum = 1
คุณยังสามารถใช้ฟังก์ชันการวิเคราะห์เพื่อจัดลำดับและรับค่า x สูงสุด:
select max(fname) over (rank() order by some_factor) from MyTbl
SELECT *
FROM (SELECT * FROM MyTbl ORDER BY Fname )
WHERE ROWNUM = 1;
top X
หนึ่งสามารถเปลี่ยนเป็นWHERE ROWNUM <= X
ด้วยOracle 12c (มิถุนายน 2013) คุณสามารถใช้งานได้ดังต่อไปนี้
SELECT * FROM MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
OFFSET 0 ROWS
เห็นได้ชัดว่าไม่จำเป็นที่คุณสามารถใช้FETCH NEXT 1 ROWS ONLY
หรือแม้กระทั่งการสั่งซื้อโดยมีความสำคัญหรือมันจะเป็นเพียงแค่เทียบเท่ากับการใช้FETCH FIRST ROW ONLY
WHERE rownum = 1
ฉันได้ลองใช้คำสั่งภายนอกของเราแล้วมันใช้งานได้เหมือนฟังก์ชั่น TOP ของ Ms-SQL ที่นั่น
TIES
ดังนั้นไกลดังนั้นดีกับจุดเชื่อมต่อที่หายไปที่สำคัญของ อ้างถึงนี้สำหรับกรณีเมื่อความสัมพันธ์ที่เกิดขึ้นสำหรับรุ่น12c +
และ12c -
คุณสามารถใช้ROW_NUMBER()
กับประโยคหนึ่งในแบบสอบถามย่อยและใช้คอลัมน์นี้แทนORDER BY
TOP N
สิ่งนี้สามารถอธิบายได้ทีละขั้นตอน
ดูตารางด้านล่างซึ่งมีสองคอลัมน์และNAME
DT_CREATED
หากคุณจำเป็นต้องใช้เพียงสองวันแรกโดยไม่คำนึงถึงNAME
คุณสามารถใช้แบบสอบถามด้านล่าง ตรรกะได้ถูกเขียนขึ้นภายในแบบสอบถาม
-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
-- Generates numbers in a column in sequence in the order of date
SELECT ROW_NUMBER() OVER (ORDER BY DT_CREATED) AS RNO,
NAME,DT_CREATED
FROM DEMOTOP
)TAB
WHERE RNO<3;
ผลลัพธ์
ในบางสถานการณ์เราต้องเลือกผลการค้นหาที่เกี่ยวข้องกับแต่ละTOP N
NAME
ในกรณีเช่นนี้เราสามารถใช้PARTITION BY
กับORDER BY
clause ในแบบสอบถามย่อย อ้างอิงแบบสอบถามด้านล่าง
-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
--Generates numbers in a column in sequence in the order of date for each NAME
SELECT ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY DT_CREATED) AS RNO,
NAME,DT_CREATED
FROM DEMOTOP
)TAB
WHERE RNO<3;
ผลลัพธ์
with (select ... ) as
ส่วนคำสั่ง) จะไม่เปลี่ยนแปลงอะไรกับปัญหานี้ CTE มีจุดมุ่งหมายในการอ่านและสนับสนุนการสืบค้น ขวา? @Sarath Avanavu
คุณสามารถทำสิ่งที่ชอบ
SELECT *
FROM (SELECT Fname FROM MyTbl ORDER BY Fname )
WHERE rownum = 1;
คุณสามารถใช้ฟังก์ชันวิเคราะห์RANKและ / หรือDENSE_RANKได้ แต่ROWNUMน่าจะง่ายที่สุด
select * from (
select FName from MyTbl
)
where rownum <= 1;
ใช้:
SELECT x.*
FROM (SELECT fname
FROM MyTbl) x
WHERE ROWNUM = 1
ถ้าใช้ Oracle9i + คุณสามารถดูโดยใช้ฟังก์ชั่นการวิเคราะห์เช่น ROW_NUMBER () แต่พวกเขาจะไม่ดำเนินการเช่นเดียวกับ ROWNUM
ในการเลือกแถวแรกจากตารางและเลือกหนึ่งแถวจากตารางเป็นสองงานที่แตกต่างกันและต้องการแบบสอบถามที่แตกต่างกัน มีหลายวิธีที่เป็นไปได้ที่จะทำเช่นนั้น สี่ของพวกเขาคือ:
เป็นครั้งแรก
select max(Fname) from MyTbl;
ที่สอง
select min(Fname) from MyTbl;
ที่สาม
select Fname from MyTbl where rownum = 1;
ที่สี่
select max(Fname) from MyTbl where rowid=(select max(rowid) from MyTbl)
ฉันมีปัญหาเดียวกันและฉันสามารถแก้ไขได้ด้วยวิธีนี้:
select a.*, rownum
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = 1
คุณสามารถสั่งซื้อผลลัพธ์ของคุณก่อนที่จะมีค่าแรกอยู่ด้านบน
โชคดี