الحصول على واحد السجلات من الجداول التي قد تنتج سجلات متعددة

StackOverflow https://stackoverflow.com/questions/608451

سؤال

لدي الطالب جدول انتساب الجدول ؛ طالب يمكن أن يكون لديك عدة سجلات القيد التي يمكن أن تكون نشطة أو غير نشطة.

أريد الحصول على اختيار هذا وقد طالب واحد سجل مؤشر على ما إذا كان هذا الطالب قد نشط الالتحاق.

فكرت في القيام بذلك في مضمنة 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

وبطبيعة الحال، استبدال فك مع وظيفة استخدامات الخاصة بك قاعدة البيانات (أو بيان حالة).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top