SQL لإرجاع رقم الصف لصف معين؟(باستخدام أوراكل ديسيبل)
سؤال
في Oracle 10g، لدي SQL هذا:
select dog.id as dogId from CANINES dog order by dog.codename asc
الذي يعود:
id
--
204
203
206
923
أريد توسيع هذا الاستعلام لتحديد رقم أوراكل الخاص بـ dog.id في مجموعة النتائج هذه.
لقد حاولت
select rownum from
(select dog.id as dogId from CANINES dog order by dog.codename asc)
where dog.id=206
لكن هذا لا يعمل بشكل جيد (يُرجع 1 بغض النظر عن معرف dog.id الذي أطابقه).كنت أتوقع العودة 3.
شكرا لمساعدتك!
ملحوظات
http://www.Oracle.com/technology/oramag/oracle/06-sep/o56asktom.html
أنا متأكد من أنني لست بحاجة إلى استخدام Rowid
المحلول
وأظن ما تريده هو أن استخدام الدوال التحليلية (RANK، DENSE_RANK
، أو ROW_NUMBER
)، أي بمعنى.
SELECT rnk
FROM (select dog.id as dogId,
ROW_NUMBER() OVER( ORDER BY dog.codename ASC ) rnk
from CANINES dog )
WHERE dogId = 206
إذا كان العمود ID في الجدول أنياب يست فريدة من نوعها، RANK، DENSE_RANK
، وROW_NUMBER
) أن يعامل بشكل مختلف العلاقات.
إذا كنت تريد أن تفعل هذا فقط مع ROWNUM،
SELECT rn
FROM (
SELECT dogId, rownum rn
FROM (select dog.id as dogId
from CANINES dog
order by dog.codename ASC) inner
) middle
WHERE dogId = 206
نصائح أخرى
إذا كنت بعد المعرف الفريد من كل صف في الجدول تحتاج ROWID، وليس ROWNUM.
وROWNUM هو pseudocolumn التي يمكن أن تغير كل مرة يتم تنفيذ قليلا من SQL (لقد عملت بها في وقت الاستعلام)
معرفة ما إذا كان هذا يعمل للكم:
إجابة
SELECT dog1.DogID, dog1.DogName, COUNT(*) AS rownumber
FROM #ids dog1, #ids dog2
WHERE dog2.DogName <= dog1.DogName
GROUP BY dog1.DogID, dog1.DogName
ORDER BY dog1.DogName
نتائج
DogID DogName rownumber
----------- ---------- -----------
204 Dog 1 1
203 Dog 2 2
206 Dog 3 3
923 Dog 4 4
دي دي ال
CREATE TABLE #ids (DogID int NOT NULL PRIMARY KEY, DogName varchar(10) NOT NULL)
INSERT INTO #ids (DogID, DogName) VALUES (204, 'Dog 1')
INSERT INTO #ids (DogID, DogName) VALUES (203, 'Dog 2')
INSERT INTO #ids (DogID, DogName) VALUES (206, 'Dog 3')
INSERT INTO #ids (DogID, DogName) VALUES (923, 'Dog 4')
في أجل تحقيق هذا الهدف، فإنه سيكون من الأفضل لتغيير الجدول وإضافة التسلسل. هذا يمكن أن يحصل لزجة إذا كنت تنوي حذف الصفوف. حيث، وربما سيكون ممارسة أفضل أن يكون لاستخدام عمود الحالة أو وبدء التشغيل نهاية التاريخ الحافز لتحديد الصفوف التي تنشط وينبغي أن تعاد.