Counting number of joined rows in left join Counting number of joined rows in left join oracle oracle

Counting number of joined rows in left join


How about something like this:

SELECT m.MESSAGEID, sum((case when mp.messageid is not null then 1 else 0 end)) FROM MESSAGE mLEFT JOIN MESSAGEPART mp ON mp.MESSAGEID = m.MESSAGEIDGROUP BY m.MESSAGEID;

The COUNT() function will count every row, even if it has null. Using SUM() and CASE, you can count only non-null values.

EDIT: A simpler version taken from the top comment:

SELECT m.MESSAGEID, COUNT(mp.MESSAGEID) FROM MESSAGE mLEFT JOIN MESSAGEPART mp ON mp.MESSAGEID = m.MESSAGEIDGROUP BY m.MESSAGEID;

Hope that helps.


You first want to count in your messaepart table before joining, i think. Try this:

   SELECT m.MessageId        , COALESCE(c, 0) as myCount     FROM MESSAGE mLEFT JOIN (SELECT MESSAGEID                , count(*) c              FROM MESSAGEPART             GROUP BY MESSAGEID) mp       ON mp.MESSAGEID = m.MESSAGEID


Don't forget to use DISTINCT in case you will LEFT JOIN more than one table:

SELECT m.MESSAGEID, COUNT(DISTINCT mp.MESSAGEID) FROM MESSAGE mLEFT JOIN MESSAGEPART mp ON mp.MESSAGEID = m.MESSAGEIDGROUP BY m.MESSAGEID;