PDA

View Full Version : سوال:مشکل این spکجاست؟



desatir7316
دوشنبه 05 تیر 1391, 17:36 عصر
سلام دوستان
لطفا این دستورات رو ببینید:


use mydb
create table a(id int primary key, reshte nvarchar(10))
create table b(id int,gerayesh nvarchar(10),
foreign key(id) references a(id))

go

insert into a values(1,'computer'),(2,'electronic')
insert into b values(1,'narmAfzar'),(1,'sakhtAfzar')

go

create proc panel(@id int) as
select a.reshte,
count(b.gerayesh) as [tedad]
from a,b
where a.id=@id and b.id=a.id
group by a.reshte


go

exec panel 1
exec panel 2



می خوام توی این sp هر رشته و تعداد گرایش هاشو نشون بدم
وقتی که چدول b اطلاعات داره مشکلی ندارم(یعنی همچین چیزی =exec panel 1) ولی وقتی که توی چدول b اطلاعات هیج گرایشی برای رشته مورد نظر ثبت نشده دیگه هیجی نشون نمی ده(مثل این =exec panel 2) در حالی که من میخوام اسم گرایش را با تعداد صفرتا برگردونه

ممنون می شم راهنمایی کنید
باید چیکار کنم
برای قسمت نام گرایش و تعداد هرکدوم باید sp های جدایی بنویسم؟
برام حیاتیه ممنون میشم کمک کنید

baktash.n81@gmail.com
دوشنبه 05 تیر 1391, 18:05 عصر
سلام

این کدی که شما نوشتید شبیه Inner Join هست ... یعنی رکورد هایی رو میاره که به ازای هر رکورد تو جدول اول حداقل یه رکورد تو جدول دوم موجود باشه ... از نظر من می توین از Left Outer Join استفاده کنی ... که تمام رکورد های جدول اول رو میاره بعد هر رکوردی که به ازاش تو جدول دوم رکورد نداشته باشیم مقدار فیلدهای انتخابی از جدول دوم رو NULL قرار می ده و در نتیجه Count اش هم صفر می شه ...

بعد از From اینو بنویس


a join b on a.id=b.id


البته به اینم توجه کن ... هر جدول کلید اصلی خودش رو باید داشته باشه ... بهتره اسم کلید اصلی شامل نام جدول هم باشه ... مثلا AID برای کلید اصلی جدول A ... مخصوصا وقتی به عنوان کلید خارجی تعریف می شه ... خوانایی خیلی بالاتر می ره ...

desatir7316
سه شنبه 06 تیر 1391, 17:00 عصر
دوست عزیز ممنون
اینم کاملش شاید به درد کسی بخوره:


use ali
create table a(id int primary key,
reshte nvarchar(10))
create table b(id int,
gerayesh nvarchar(10),
foreign key(id) references a(id))
go

insert into a values(1,'computer'),(2,'electronic');
insert into b values(1,'narm'),(1,'sakht'),(1,'hoosh');
go
alter proc panel(@id int)as
select
a.reshte,
count(b.gerayesh) as [tedad]
from
a left join b
on
a.id=b.id
where
a.id=@id
group by
a.reshte
go

exec panel 1
exec panel 2