← بازگشت به تالار
هنرجو حل‌شده

چرا JOIN در SQL تعداد ردیف‌ها را بیشتر می‌کند؟

علی محمدی 1405/05/17 13:10 💬 1 پاسخ ◉ 198 بازدید
جدول Courses را به CourseTags وصل کرده‌ام و هر دوره چند بار در خروجی دیده می‌شود. استفاده از DISTINCT مشکل را پنهان می‌کند، اما می‌خواهم علت اصلی و روش درست گرفتن یک ردیف برای هر دوره را بدانم.

پاسخ‌ها

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.
▲ 19 ▼ 0