هنرجو
حلشده
چرا JOIN در SQL تعداد ردیفها را بیشتر میکند؟
علی محمدی
1405/05/17 13:10
💬 1 پاسخ
◉ 198 بازدید
پاسخها
1 پاسخ ثبتشده
مهندس امیررضا مرادی
مدرس
✓ پاسخ پذیرفتهشده
JOIN برای هر Match یک ردیف خروجی میسازد. اگر هر Course پنج Tag داشته باشد، همان Course پنج بار دیده میشود؛ این Duplicate واقعی نیست، بلکه Cardinality رابطه یکبهچند است.
اگر فقط وجود Tag مهم است از EXISTS استفاده کنید. اگر یک مقدار تجمیعی میخواهید، ابتدا Tagها را GROUP BY کنید. برای ساخت لیست Tag میتوانید از STRING_AGG استفاده کنید:
SELECT c.Id, c.Title, STRING_AGG(t.Title, N', ') AS Tags
FROM Courses c
LEFT JOIN CourseTags ct ON ct.CourseId = c.Id
LEFT JOIN Tags t ON t.Id = ct.TagId
GROUP BY c.Id, c.Title;
DISTINCT فقط زمانی درست است که واقعاً میخواهید ردیفهای کاملاً یکسان حذف شوند، نه برای پنهان کردن طراحی اشتباه Query.