الحصول على واحد السجلات من الجداول التي قد تنتج سجلات متعددة
-
03-07-2019 - |
سؤال
لدي الطالب جدول انتساب الجدول ؛ طالب يمكن أن يكون لديك عدة سجلات القيد التي يمكن أن تكون نشطة أو غير نشطة.
أريد الحصول على اختيار هذا وقد طالب واحد سجل مؤشر على ما إذا كان هذا الطالب قد نشط الالتحاق.
فكرت في القيام بذلك في مضمنة UDF يستخدم هوية الطالب في الانضمام إلى الالتحاق الجدول ، ولكن أنا أتساءل عما إذا كان هناك طريقة أفضل للقيام بذلك في عبارة حدد.
UDF الدعوة قد تبدو شيئا مثل:
Select Student_Name,Student_Email,isEnrolled(Student_ID) from Student
ما قد البديل - مع SQL - تبدو وكأنها ؟
المحلول
select Student_Name,
Student_Email,
(select count(*)
from Enrollment e
where e.student_id = s.student_id
) Number_Of_Enrollments
from Student e
وسوف تحصل على عدد المسجلين، والذي من شأنه أن يساعد.
نصائح أخرى
لماذا لا تنضم إلى الثانوية حدد ؟ خلافا لغيرها من الحلول هذا ليس إطلاق فرعي لكل صف عاد ، ولكن يجمع بيانات القيد للجميع في كل مرة.جملة قد لا يكون صحيحا تماما ، ولكن يجب أن تحصل على هذه الفكرة.
SELECT
s.student_name,
s.student_email,
IsNull( e.enrollment_count, 0 )
FROM
Students s
LEFT OUTER JOIN (
SELECT
student_id,
count(*) as enrollment_count
FROM
enrollments
WHERE
active = 1
GROUP BY
student_id
) e
ON s.student_id = e.student_id
حدد من الالتحاق كما يمكن إعادة بنائه بوصفها وظيفة والتي ترجع الجدول بالنسبة لك للانضمام إلى على.
CREATE FUNCTION getAllEnrollmentsGroupedByStudent()
RETURNS @enrollments TABLE
(
student_id int,
enrollment_count int
) AS BEGIN
INSERT INTO
@enrollments
(
student_id,
enrollment_count
) SELECT
student_id,
count(*) as enrollment_count
FROM
enrollments
WHERE
active = 1
GROUP BY
student_id
RETURN
END
SELECT
s.student_name,
s.student_email,
e.enrollment_count
FROM
Students s
JOIN
dbo.getAllEnrollmentsGroupedByStudent() e
ON s.student_id = e.student_id
تحرير:
Renze دي وال تصحيح خطأي SQL!
وحاول شيئا من هذا القبيل:
SELECT Student_Name, Student_Email, CAST((SELECT TOP 1 1 FROM Enrollments e WHERE e.student_id=s.student_id) as bit) as enrolled FROM Student s
واعتقد انه يمكن أيضا استخدام موجود بيان في اختيار ولكن ليس إيجابيا
ومحاولة تجنب استخدام UDFS أو الاستعلامات الفرعية، فهي القتلة الأداء. يبدو banjolity إلى havea حل جيد على خلاف ذلك لأنه يستخدم الجدول derivd بدلا من UDF أو subselect.
select students.name,
decode(count(1), 0, "no enrollments", "has enrollments")
from students, enrollments
where
students.id = enrollments.sutdent_id and
enrollments.is_active = 1 group by students.name
وبطبيعة الحال، استبدال فك مع وظيفة استخدامات الخاصة بك قاعدة البيانات (أو بيان حالة).