PDA

View Full Version : نشان ندادن فیلد null در یه سلکت در SQL



roomezonline
دوشنبه 18 دی 1391, 14:05 عصر
سلام دوستان خسته نباشید

من یه سلکت دارم که میاد لیست دروس مربوط به دانش اموز و نمرات ثبت شده رو برای اون درس رو نشون میده

میخوام در سلکت انجام شده درسهایی که نمره ای براشون ثبت نشده رو نشون ندم . تو سلکت معمولی میشه اما توی این کوئری که من دارم نتونستم

از اساتید محترم تقاضای راهنمایی دارم

اینم اسکریپت جداول و داده ها
97999


کوئری :
راهنمای جداول :
1. جدول دانش آموزان tb_stu
2. جدول ثبت نمرات tb_score

اسم درس : score_lesson_name
کد دانش آموز : stu_code در جدول دانش آموزان tb_stu
کد دانش آموز : score_stu_code در جدول نمرات tb_score
ماه ثبت نمره : score_month
سال تحصیلی : score_year
کد کلاس : score_classe_code

97996



SELECT score_lesson_name,
(SELECT '[' + score_score + ']'
FROM tb_score
WHERE (score_lesson_name = T.score_lesson_name) AND (score_stu_code = @stu_code) AND (score_month = @month) AND
(score_year = @year) FOR XML PATH('')) AS score_score
FROM tb_score AS T
WHERE (score_classe_code = @classe)
GROUP BY score_lesson_name







میخوام رکوردهای که نمراتشون null هست رو از تو لیست حذف کنم به عبارتی میخوام نشون داده نشوند

با تشکر

محمد سلیم آبادی
دوشنبه 18 دی 1391, 19:03 عصر
این چطور؟ اینم سطرهای ناخواسته رو برمیگردونه؟
SELECT score_lesson_name, D.score_score
FROM (SELECT *
FROM tb_score
WHERE (score_classe_code = @classe)
GROUP BY score_lesson_name) AS T

CROSS APPLY (SELECT '[' + score_score + ']'
FROM tb_score
WHERE (score_lesson_name = T.score_lesson_name)
AND (score_stu_code = @stu_code)
AND (score_month = @month)
AND (score_year = @year)
FOR XML PATH('')) AS D(score_score)

roomezonline
سه شنبه 26 دی 1391, 17:39 عصر
با سلام مجدد

اول اینکه عذر میخوام که کمی غیبتم طولانی شد اخه تاپیک رو من زدم و نشد بیام اینجا

دوم اینکه از وقتی که گذاشتین سپاسگزارم

باید بگم خیر نشد بازم درسهای خالی از نمره رو برمیگردونه

نمیدونم چه باید کرد

محمد سلیم آبادی
سه شنبه 26 دی 1391, 21:56 عصر
تعجب میکنم، شما عین این کوئری رو استفاده کردین؟ cross apply مثل join عمل میکنه و subquery که شما استفاده کردین مثل left join.
بله اگه من outer apply زده بودم میشد گفت که null هم میومدن.

به هر صورت اینو امتحان کنید:

select * from
(SELECT score_lesson_name,
(SELECT '[' + score_score + ']'
FROM tb_score
WHERE (score_lesson_name = T.score_lesson_name) AND (score_stu_code = @stu_code) AND (score_month = @month) AND
(score_year = @year) FOR XML PATH('')) AS score_score
FROM tb_score AS T
WHERE (score_classe_code = @classe)
GROUP BY score_lesson_name

) as d where score_score is not null

roomezonline
چهارشنبه 27 دی 1391, 17:03 عصر
با تشکر از زحمات شما

مرسی این کد اخری جوابگو بود و درست شد

محمد سلیم آبادی
شنبه 30 دی 1391, 07:50 صبح
کوئری که بر اساس CROSS APPLY بود مشکلی نداره، مساله بر میگرده به FOR XML PATH. یعنی حتی اگه هیچ سطری بر نگرده (empty set) بازم NULL به عنوان خروجی انتخاب میشه که خب این مقدار برای ما ناخواسته هست.