PDA

View Full Version : سوال: مشکل در اجرای کوئری



farshid_82
چهارشنبه 18 مرداد 1391, 19:14 عصر
سلام
دوستان مشکل کد زیر چیه که با دیتابیس sql اجرا میشه ولی با firebird نه؟

Select Row_Number() OVER(Order By SDate) as RowID,*
From Table1

BORHAN TEC
چهارشنبه 18 مرداد 1391, 20:19 عصر
توجه داشته باشید که دستورات SQL استاندارد در همه DBMS های استاندارد عمل می کنه. هر DBMS ای دستورات خاص خودش رو هم داره و نام زبان مربوط به Firebird و Interbase زبان isql است و در SQL Server زبان TSQL است و بنابراین نباید توقع داشته باشید که تمامی دستورات TSQL در مورد Firebird هم صدق کند و برعکس.
بنابراین شما باید خودتان را با آن DBMS خاص هماهنگ کنید و تا جایی که امکان دارد از دستورات و تکنیکهایی استفاده کنید که در همه DBMS ها جوابگو باشد.

farshid_82
چهارشنبه 18 مرداد 1391, 20:40 عصر
خیلی ممنون از جوابتون
آیا مرجع کاملی هست برای آشنایی با isql یا تبدیل tsql به isql

BORHAN TEC
چهارشنبه 18 مرداد 1391, 20:48 عصر
خوشبختانه در رابطه با Firebird کتابهای زیادی وجود داره و در بعضی ها حجم کتاب از 1000 صفحه هم تجاوز می کنه. به نظر من یکی از بهترین کتابهای موجود کتاب خانم Helen Borrie است.

farshid_82
پنج شنبه 19 مرداد 1391, 02:45 صبح
من داشتم می گشتم دنبال تابع جایگزین برای row_number که به لینک زیر برخوردم ولی همین ارور قبلی میده نظرتون چیه؟

http://stackoverflow.com/questions/10702204/find-row-number-in-a-sort-based-on-row-id-then-find-its-neighbours

BORHAN TEC
پنج شنبه 19 مرداد 1391, 12:43 عصر
به مثالهای زیر در Firebird توجه کن:
1- ده نام اول از جدول People

select first 10 id, name from People order by name asc
2- همه چیز را بر می گرداند ولی بر اساس 10 نام اول

select skip 10 id, name from People order by name asc
3- این دستور 10 رکورد آخر را بر می گرداند. (به پرانتزهای دوبل توجه شود!)

select skip ((select count(*) - 10 from People)) id, name from People order by name asc
4- رکورد شماره 81-100 را بر می گرداند.

select first 20 skip 80 id, name from People order by name asc

منبع برای مطالعه بیشتر:
http://www.firebirdsql.org/refdocs/langrefupd20-select.html

farshid_82
پنج شنبه 19 مرداد 1391, 14:07 عصر
آقای عشایری ممنون از مثال ها ولی چیزی که من دنبالشم ایجاد ستون ردیف علتش اینه که تو محاسبه مانده هر سطر در دفاتر مالی اگر مرتب بر اساس تاریخ باشه به مشکل میخوریم.تو sql server 2005 به بالا با تابع row_number به راحتی ستون ردیف ایجاد میشه ولی برای firebird این تابع نیست البته تابعی به نام rank بود ولی تو برنامه sql manager for firebird همچنان پیدا نمی کنه.

در لینکی که معرفی کردم در جواب گفته که در firebird میشه ازش استفاده کرد ولی من هرچی می گردم نیست شاید نیاز به فایل خاصی داره.

BORHAN TEC
پنج شنبه 19 مرداد 1391, 16:20 عصر
یه سوال داشتم که دقیقتر مشکلتون رو متوجه بشم.
ببنید مثلاً شما می خواهید از کوئری زیر استفاده کنید:

Select * From Employee where Name Like '%Li%' ( و یا هر کوئری دیگری که یک مجموعه را برگرداند)
حال با اجرای کوئری بالا می خواهید دقیقاً در نتایج بازگشتی چه اتفاقی بیفتد؟
آیا می خواهید رکوردهای بازگشتی بر حسب ردیف با شماره های 1 تا تعداد رکوردهای بازگشتی نام گذاری شوند؟
مثلاً چیزی مثل این؟

1 Ali
2 Alireza
3 AliMohammad
و یا اینکه می خواهید شماره ردیف واقعی رکورد ها در جدول بازگشت داده شود. عنی چیزی مل این:

13 Ali
25 Alireza
39 AliMohammad

farshid_82
پنج شنبه 19 مرداد 1391, 17:17 عصر
دقیقا مثل روش اول یعنی نمایش ردیف از 1 تا آخرین رکورد.حالا برای اینکه بدونید می خوام چی کار کنم در اصل می خوام کد زیر و در firebird اجرا کنم

Declare @Tbl Table(SDate varchar(10), Cash int, Pay int)

Insert Into @Tbl Values ('1390/11/10', 10000, 0)
Insert Into @Tbl Values ('1390/12/09', 10000, 0)
Insert Into @Tbl Values ('1390/12/11', 2000, 0)
Insert Into @Tbl Values ('1390/12/11', 0, 1000)
Insert Into @Tbl Values ('1390/12/16', 10000, 0)
Insert Into @Tbl Values ('1390/12/17', 0, 1500)

;With tbl as (
Select
Row_Number() Over(Order By SDate) as RowID
,*
From
@Tbl)
, Result (ID, SDate, Cash, Pay, Remind) as(
Select
RowID
,SDate
,Cash
,Pay
,Remind = Cash - Pay
From tbl
Where RowID = 1
UNION ALL
Select
ID = ID + 1
,T.SDate
,T.Cash
,T.Pay
,Remind = R.Remind + T.Cash - T.Pay
From
tbl T INNER JOIN Result R
ON
T.RowID = R.ID + 1
)
Select * From Result

ho.yasreby
شنبه 12 مرداد 1392, 16:01 عصر
دوستان من یه مشکل دیگه دارم
یک دستور sql رو در adoquery متصل به دیتابیس اکسس اجرا میکنم جواب میده
در خود sqlservermanagment هم اجرا میکنم جواب میده
ولی وقتی همان adoquery را متصل میکنم به sqlserver و هیچ تغییری به sql آن نمیدم جدولم هم در sql و هم در access دقیقآ یکسان است ولی اجرا نمیشود
گیر کردم


ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from Table_1');
ADOQuery1.SQL.Add('where name like "%'+edit1.Text+'%"');
ADOQuery1.Open;


البیته این کد رو مستقیم به کوری میدم جواب میده



select * from Table_1 where name like '%h%'