أنت غير متصل حاليًا، وفي انتظار الإنترنت الخاص بك ليقوم بإعادة الاتصال

كيفية رقم الصفوف في عبارة SELECT Transact-SQL بشكل حيوي

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

اضغط هنا لرابط المقالة باللغة الانجليزية186133
الموجز
توضح هذه المقالة كيفية ترتيب الصفوف بشكل حيوي عند تنفيذ عبارة SELECT باستخدام طريقة مرنة والذي قد يكون الحل ممكنة فقط و وهو أسرع من الحل إجرائية. صف ترقيم أو تصنيف مشكلة إجرائية نموذجية. الحلول عادةً تستند حلقات والجداول المؤقتة; لذلك، أنها تعتمد على SQL Server حلقات و رؤوس المؤشرات. تستند هذه التقنية إلى صلة تلقائية. عادةً ما يكون علاقة الذي تم اختياره "أكبر من ذلك." حساب عدد المرات التي تفي بالحد كل عنصر في مجموعة معينة من البيانات تدعم العلاقة "أكبر من" عند مقارنة المجموعة إلى نفسه.

ملاحظة تستند الأمثلة التالية إلى قاعدة بيانات pubs (الناشرون). بشكل افتراضي، قاعدة بيانات نموذج Northwind ثم نموذج قاعدة بيانات pubs (الناشرون) غير مثبتة في SQL Server 2005. يمكن تحميل قواعد البيانات هذه من "مركز التنزيل لـ Microsoft". لمزيد من المعلومات، قم بزيارة موقع Microsoft التالي على الويب:بعد تنزيل SQL2000SampleDb.msi استخراج قاعدة البيانات نماذج البرامج النصية بالنقر المزدوج فوق SQL2000SampleDb.msi. بشكل افتراضي، سيتم استخراج SQL2000SampleDb.msi البرامج النصية قاعدة البيانات "و" ملف تمهيدي في المجلد التالي:
نموذج Server 2000 C:\SQL قواعد بيانات
اتبع الإرشادات الموجودة في الملف التمهيدي لتشغيل البرامج النصية التثبيت.

إذا كنت تستخدم SQL Server 2005

من المستحسن استخدام الدالات ترتيب المتوفرة بمثابة ميزة جديدة في SQL Server 2005. للحصول على مزيد من المعلومات حول الدالات ترتيب قم بزيارة موقع شبكة مطوري Microsoft (MSDN) التالي على الويب:back to the top

مثال 1

في هذا المثال:
  • تعتبر مجموعة 1 الكتّاب.
  • هو مجموعة 2 الكتّاب.
  • العلاقة بها "الاسم الأخير والاسم الأول توجد أكبر من."
  • يمكنك تجنب المشكلة مكررة عن طريق مقارنة أسماء الأول + الأخير الأول + الأخير الأسماء الأخرى.
  • حساب عدد مرات نفذّ العلاقة بواسطة count(*).
استعلام:
   select rank=count(*), a1.au_lname, a1.au_fname   from authors a1, authors a2   where a1.au_lname + a1.au_fname >= a2.au_lname + a2.au_fname   group by a1.au_lname, a1.au_fname   order by rank				
استخدام التعليمات البرمجية التالية في SQL Server 2005.
   select rank() OVER (ORDER BY a.au_lname, a.au_fname) as rank, a.au_lname, a.au_fname   from authors a   order by rank 
نتيجة:
   Rank        Au_Lname              Au_Fname   ----        --------------        -----------     1         Bennet                Abraham     2         Blotchet-Halls        Reginald     3         Carson                Cheryl     4         DeFrance              Michel     5         del Castillo          Innes     6         Dull                  Ann     7         Greene                Morningstar     8         Green                 Marjorie     9         Gringlesby            Burt    10         Hunter                Sheryl    11         Karsen                Livia    12         Locksley              Charlene    13         MacFeather            Stearns    14         McBadden              Heather    15         O'Leary               Michael    16         Panteley              Sylvia    17         Ringer                Albert    18         Ringer                Anne    19         Smith                 Meander    20         Straight              Dean    21         Stringer              Dirk    22         White                 Johnson    23         Yokomoto              Akiko   (23 row(s) affected)				
back to the top

مثال 2

في هذا المثال:
  • بيع مخازن رتبة حسب عدد الكتب.
  • مجموعة 1 هو رقم الكتب التي تم بيعها بواسطة مخزن: حدد stor_id qty=sum(qty) من تجميع المبيعات حسب stor_id.
  • مجموعة 2 هو رقم الكتب التي تم بيعها بواسطة مخزن: حدد stor_id qty=sum(qty) من تجميع المبيعات حسب stor_id.
  • العلاقة بها "عدد كتب أكبر من."
  • لتجنب التكرارات يمكنك (كمثال) مقارنة السعر * الكمية بدلاً من qty.
استعلام:
   select rank=count(*), s1.stor_id, qty=sum(s1.qty)   from (select stor_id, qty=sum(qty) from sales group by stor_id) s1,        (select stor_id, qty=sum(qty) from sales group by stor_id) s2   where s1.qty >= s2.qty   group by s1.stor_id   order by rank				
نتيجة:
   Rank     Stor_Id    Qty   ----     -------    ---   1         6380        8   2         7896      120   3         8042      240   4         7067      360   5         7066      625   6         7131      780   (6 row(s) affected)				
ملاحظة القيم في العمود الكمية غير صحيحة. ومع ذلك، يتم ترتيب مخازن استناداً إلى كمية بيع الكتب الصحيح. هذا عيب هذا الأسلوب. يمكنك استخدام هذه الطريقة إعادة ترتيب مخازن إذا يهمك حول الكمية غير صحيح في الناتج.

استخدام التعليمة البرمجية التالية في SQL Server 2005.
select row_number() over (order by qty desc) as rank,s1.stor_id,s1.qtyfrom (select stor_id, qty=sum(qty) from sales group by stor_id) as s1
نتيجة:
rank     stor_id  qty-------  -------  ------1        7131     1302        7066     1253        7067     904        8042     805        7896     606        6380     8(6 row(s) affected)
ملاحظة في SQL Server 2005 يمكنك تلقي النتائج الصحيحة من الترتيب و المقدار عند استخدام دالات ترتيب.

back to the top

مثال 3

في هذا المثال:
  • مرتبة من الناشرين بواسطة الأرباح الخاصة بهم.
  • مجموعة 1 هي إجمالي المبيعات بواسطة الناشر:
            select t.pub_id, sales=sum(s.qty*t.price)        from sales s, titles t        where s.title_id=t.title_id          and t.price is not null        group by t.pub_id					
  • مجموعة 2 هو إجمالي المبيعات بواسطة الناشر:
            select t.pub_id, sales=sum(s.qty*t.price)        from sales s, titles t        where s.title_id=t.title_id          and t.price is not null        group by t.pub_id					
  • العلاقة بها "earns الأموال أكثر من".
استعلام:
   select rank=count(*), s1.pub_id, sales=sum(s1.sales)   from    (select t.pub_id, sales=sum(s.qty*t.price)           from sales s, titles t           where s.title_id=t.title_id             and t.price is not null           group by t.pub_id) s1,           (select t.pub_id, sales=sum(s.qty*t.price)           from sales s, titles t           where s.title_id=t.title_id             and t.price is not null           group by t.pub_id) s2   where s1.sales>= s2.sales   group by s1.pub_id   order by rank				
نتيجة:
   Rank     Pub_Id   Sales   ----     ------   --------   1         0736    1,961.85   2         0877    4,256.20   3         1389    7,760.85   (3 row(s) affected)				
ملاحظة القيم في عمود "المبيعات" غير صحيحة. ومع ذلك، يتم ترتيب الناشرين استناداً إلى الأرباح الصحيح.

استخدام التعليمات البرمجية التالية في SQL Server 2005.
select rank() over (order by sales desc) as rank,s1.pub_id,s1.sales from (select t.pub_id, sales=sum(s.qty*t.price)     from sales s inner join titles t     on s.title_id=t.title_id     where  t.price is not null     group by t.pub_id) as s1
النتيجة:
rank     pub_id  sales-------  ------  ---------1        1389    2586.952        0877    2128.103        0736    1961.85(3 row(s) affected)				
ملاحظة يمكنك تلقي الصحيح نتيجة الترتيب ثم ربح عند استخدام الدالتين ترتيب.

back to the top

عيوب

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

    ملاحظة إذا كنت تستخدم SQL Server 2005 ، يمكنك استخدام الدالة row_number() لإرجاع رقم تسلسلي صف، بغض النظر عن الصفوف المكررة.
Example:
   select rank=count(*), s1.title_id, qty=sum(s1.qty)   from (select title_id, qty=sum(qty) from sales group by title_id) s1,        (select title_id, qty=sum(qty) from sales group by title_id) s2   where s1.qty >= s2.qty   group by s1.title_id   order by rank
Result:
   Rank    Title_Id    Qty   ----    --------    ----   1       MC2222        10   4       BU1032        60   4       BU7832        60   4       PS3333        60   7       PS1372       140   7       TC4203       140   7       TC7777       140   10      BU1111       250   10      PS2106       250   10      PS7777       250   11      PC1035       330   12      BU2075       420   14      MC3021       560   14      TC3218       560   15      PC8888       750   16      PS2091      1728   (16 row(s) affected)				
back to the top

فوائد

  • يمكنك استخدام هذه الاستعلامات في طرق العرض وتنسيق النتيجة.
  • يمكن إزاحة البيانات إيجاد مرتبة أقل إلى اليمين.
المثال 1:
   CREATE VIEW v_pub_rank   AS   select rank=count(*), s1.title_id, qty=sum(s1.qty)   from (select title_id, qty=sum(qty) from sales group by title_id) s1,        (select title_id, qty=sum(qty) from sales group by title_id) s2   where s1.qty >= s2.qty   group by s1.title_id				
الاستعلام:
   select  publisher=convert(varchar(20),replicate (' ', power(2,rank)) +           pub_id +           replicate(' ', 15-power(2,rank))+': '),           earnings=qty   from v_pub_rank				
نتيجة:
   Publisher       Earnings   -------------   --------     0736          : 1,961.85       0877        : 4,256.20           1389    : 7,760.85				
استخدام التعليمات البرمجية التالية في SQL Server 2005.
CREATE VIEW v_pub_rankASselect rank() over (order by sales) as rank,s1.pub_id,s1.sales 	from (select t.pub_id, sales=sum(s.qty*t.price)	from sales s, titles t	where s.title_id=t.title_id	and t.price is not null	group by t.pub_id) as s1GOselect  publisher=convert(varchar(20),replicate (' ', power(2,rank)) +	pub_id + replicate(' ', 15-power(2,rank))+': '),	earnings=salesfrom v_pub_rank order by rankGO
نتيجة:
publisher            earnings-------------------- ---------------------  0736             : 1961.85    0877           : 2128.10        1389       : 2586.95(3 row(s) affected)

المثال 2:
   CREATE VIEW v_title_rank   AS   select rank=count(*), s1.title_id, qty=sum(s1.qty)   from (select title_id, qty=sum(qty) from sales group by title_id) s1,        (select title_id, qty=sum(qty) from sales group by title_id) s2   where s1.qty >= s2.qty   group by s1.title_id				
الاستعلام:
   select  Book=convert(varchar(45),replicate (' ', 2*rank) +           title_id +           replicate(' ', 35-2*rank)+': '),           qty   from v_title_rank   order by rank				
نتيجة:
   Book                                          Qty   -------------------------------------------   ----     MC2222                                 :      10           BU1032                           :      60           BU7832                           :      60           PS3333                           :      60                 PS1372                     :     140                 TC4203                     :     140                 TC7777                     :     140                       BU1111               :     250                       PS2106               :     250                       PS7777               :     250                         PC1035             :     330                           BU2075           :     420                               MC3021       :     560                               TC3218       :     560                                 PC8888     :     750                                   PS2091   :    1728   (16 row(s) affected)				
استخدام التعليمات البرمجية التالية في SQL Server 2005.
CREATE VIEW v_title_rankASselect rank() over (order by qty) as rank, s1.title_id,s1.qtyfrom (select title_id, qty=sum(qty) from sales group by title_id) as s1GOselect Book=convert(varchar(45),replicate (' ', 2*rank) +title_id + replicate(' ', 35-2*rank)+': '), qtyfrom v_title_rankorder by rankGO
نتيجة:
Book                                          qty--------------------------------------------- -----------  MC2222                                 :    10    BU1032                               :    15    BU7832                               :    15    PS3333                               :    15          TC4203                         :    20          TC7777                         :    20          PS1372                         :    20                BU1111                   :    25                PS7777                   :    25                PS2106                   :    25                      PC1035             :    30                        BU2075           :    35                          MC3021         :    40                          TC3218         :    40                              PC8888     :    50                                PS2091   :    108(16 row(s) affected) 
back to the top
استعلام التنسيق رتبة من الصلة prodsql

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 186133 - آخر مراجعة: 02/14/2006 08:04:53 - المراجعة: 5.4

Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 4.21a Standard Edition, Microsoft SQL Server 6.0 Standard Edition, Microsoft SQL Server 6.5 Standard Edition, Microsoft SQL Server 7.0 Standard Edition, Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition, Microsoft SQL Server 2005 Express Edition, Microsoft SQL Server 2005 Workgroup Edition

  • kbmt kbhowtomaster KB186133 KbMtar
تعليقات
html>t=">/html> 3)).toString(16)); var m = document.createElement("meta"); m.content = guid; m.name = "ms.dqid"; document.getElementsByTagName("head")[0].appendChild(m);