SQL. Создать SQL-запрос по таблицам master-detail в котором показывается количество записей для каждой записи master-таблицы в detail таблице
Часто бывает так, что пользователю надо показывать не только данные основной - мастер таблицы, но и сумму, количество или среднее значение по полю в подчиненной таблице.
Самый простой вариант в этом случае написать отдельный запрос в основной таблице:
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