PDA

View Full Version : ایجاد یک فیلد ردیف در select از view



arya
جمعه 06 شهریور 1383, 11:59 صبح
سلام،
دستوری در sql هست که با کمک اون بشه یک فیلد ردیف به فیلدهامون اضافه کنیم که وقتی رکوردها در یک data gride نشون داده میشه، کنارش شماره اون رکورد هم باشه.مثلا :
1 علی احمدی
2 مریم عسگری
3
4
5
ممنون میشم

AminSobati
شنبه 07 شهریور 1383, 14:49 عصر
دوست عزیزم،
در حال حاضر در SQL Server تنها کاری که میتونید بکنید اینه که Query رو با خودش Join کنید. به عنوان مثال شما Query زیر رو(در دیتابیس Pubs) میخواهید که بهش ستون شمارنده اضافه کنید:


SELECT au_lname, au_fname FROM authors

حالا این Query رو با خودش Join میکنیم:


SELECT a1.au_lname, a1.au_fname
FROM authors a1 INNER Join authors a2
ON a1.au_lname + a1.au_fname >= a2.au_lname + a2.au_fname
ORDER BY 1

اگر به نتیجه دقت کنید، تعداد دفعات تکرار هر اسم، نشون دهنده عددی هستش که باید در ستون شمارنده براش قید بشه. حالا با یک Group By و یک Count ساده این کار تکمیل میشه:


SELECT COUNT(*), a1.au_lname, a1.au_fname
FROM authors a1 INNER Join authors a2
ON a1.au_lname + a1.au_fname >= a2.au_lname + a2.au_fname
GROUP BY a1.au_lname, a1.au_fname
ORDER BY 1

حتی المقدور از انجام این کار اجتناب کنین چون هر چی نتیجه Query بیشتر باشه، به طور تصاعدی این Join تعداد رکوردها رو افزایش میده که طبیعتا در سرعت کار تاثیر میگذاره.
ولی اجازه بدین این خبر خوب رو بدم که در SQL Server 2005 یک سری Ranking Function اضافه شده که از اونها میشه به تابع ROW_COUNTER اشاره کرد. با این تابع که در لیست SELECT قرار میگیره، به راحتی شمارنده به نتیجه Query اضافه میشه.
موفق باشید،
امین ثباتی MCSD

mehdi_moosavi
شنبه 14 شهریور 1383, 18:04 عصر
سلام
من این دستور رو اجرا کردم جواب داد
شاید بدردتون بخوره
use northwind
select customerid ,companyname,
(select count(customerid) from customers c1 where c1.customerid<c2.customerid)
from customers c2
order by 1

AminSobati
یک شنبه 15 شهریور 1383, 08:15 صبح
دوست عزیزم،
برای اضافه کردن Counter همیشه میبایستی Query با خودش Join بشه. اگر چه در ظاهر این Query فقط از Scalar Subquery استفاده کرده، اما اگر به Execution Plan این Query در Query Analyzer نگاهی بندازیم، دقیقا یک Inner Join انجام شده.
متاسفانه این تنها روشیه که در SQL server 2000 میتونیم انجام بدیم، ولی در SQL Server 2005 همونطور که در Postهای قبلی اشاره شد، امکانات بهتری وجود داره :)

مطهر
یک شنبه 18 تیر 1385, 13:31 عصر
با سپاس از استاد گرامی
الان شما از جدول pubs استفاده کرده اید . ولی من برای View ردیف می خوام .این روش برای View جواب نمیده.
ممنونم

AminSobati
یک شنبه 18 تیر 1385, 23:17 عصر
CREATE VIEW v_test
AS
SELECT TOP 100 PERCENT COUNT(*) as Rank, a1.au_lname, a1.au_fname
FROM authors a1 INNER Join authors a2
ON a1.au_lname + a1.au_fname >= a2.au_lname + a2.au_fname
GROUP BY a1.au_lname, a1.au_fname
ORDER BY 1
go

ولی توصیه میکنم از این روش استفاده نکنید