SQL. Создать SQL-запрос по таблицам master-detail в котором показывается количество записей для каждой записи master-таблицы в detail таблице

·

1 min read

Часто бывает так, что пользователю надо показывать не только данные основной - мастер таблицы, но и сумму, количество или среднее значение по полю в подчиненной таблице.

Самый простой вариант в этом случае написать отдельный запрос в основной таблице:

SELECT
    ...
    (SELECT SUM(d.Amt) FROM tdetail d WHERE d.parentid = m.id) as SumAmt,
    ...
FROM tmaster m

Но при больших данных данный запрос будет тормозит очень сильно.

Какое решение? Итак, имеем две таблицы:

PPC_BatIssues - master, RRowID - primary key

PPC_RecIssues - detail, RPackID - foreign key

Наш запрос будет таким:

SELECT
    PPC_BatIssues.RRowID,
    PPC_BatIssues.PackDate,
    PPC_BatIssues.ProcNote,
    PPC_BatIssues.ProcTime,
    TotCount.RecTotCount,
    ExeCount.RecExeCount,
    ErrCount.RecErrCount,
    PPC_BatIssues.PackFile,
    PPC_BatIssues.PackNote,
    PPC_BatIssues.SysAddUser,
    PPC_BatIssues.SysAddTime,
    PPC_BatIssues.SysModUser,
    PPC_BatIssues.SysModTime
FROM PPC_BatIssues
LEFT OUTER JOIN
    (SELECT Count(*) as RecTotCount, RPackID
    FROM PPC_RecIssues group by RPackID) as TotCount
    ON PPC_BatIssues.RRowID = TotCount.RPackID
LEFT OUTER JOIN
    (SELECT Count(*) as RecExeCount, RPackID
    FROM PPC_RecIssues WHERE (IsProcessed = 1)
    GROUP BY RPackID) as ExeCount
    ON PPC_BatIssues.RRowID = ExeCount.RPackID
LEFT OUTER JOIN
    (SELECT Count(*) as RecErrCount, RPackID
    FROM PPC_RecIssues WHERE (ErrCode is not null)
    GROUP BY by RPackID) as ErrCount
    ON PPC_BatIssues.RRowID = ErrCount.RPackID