SQL لإرجاع رقم الصف لصف معين؟(باستخدام أوراكل ديسيبل)

StackOverflow https://stackoverflow.com/questions/534217

  •  22-08-2019
  •  | 
  •  

سؤال

في 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')

في أجل تحقيق هذا الهدف، فإنه سيكون من الأفضل لتغيير الجدول وإضافة التسلسل. هذا يمكن أن يحصل لزجة إذا كنت تنوي حذف الصفوف. حيث، وربما سيكون ممارسة أفضل أن يكون لاستخدام عمود الحالة أو وبدء التشغيل نهاية التاريخ الحافز لتحديد الصفوف التي تنشط وينبغي أن تعاد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top