Добавление нового столбца в запросе SQL для отображения, содержит ли запись дочерний элемент или нет
Требуется отобразить записи действий (таблица S_EVT_ACT) вместе с новым столбцом в нем, чтобы показать, содержит ли запись действий какие-либо вложения или нет. Вложения активности принадлежат таблице S_ACTIVTY_ATT и связаны с родительской активностью как PAR_ROW_ID вложения = ROW_ID действия.
Новый столбец может отображать выходные данные в виде Y или N для каждой записи активности. Кроме того, новый столбец может отображать количество вложений для действия.
каким должен быть запрос SQL в этом случае.
2 ответа
Использование exists
:
select a.*,
(case when exists (select 1
from S_ACTIVTY_ATT att
where att.PAR_ROW_ID = a.ROW_ID
)
then 'Y' else 'N'
end) as has_attachment
from S_EVT_ACT a;
В общем, exists
работает лучше, чем любое решение с агрегацией. В частности, с индексом на att(PAR_ROW_ID)
это должно быть довольно быстро.
Если вы действительно хотите иметь столбец, вы должны заполнять (увеличивать) значение каждый раз, когда вставляете вложение. Если вы хотите видеть это только в SELECT-Query, вы можете сделать что-то вроде этого:
SELECT act.*, att.ATT_COUNT
FROM S_EVT_ACT act
LEFT OUTER JOIN (SELECT PAR_ROW_ID, COUNT(*) AS ATT_COUNT
FROM S_ACTIVTY_ATT
GROUP BY PAR_ROW_ID ) AS att ON (act.ROW_ID = att.PAR_ROW_ID)
Обратите внимание: это должно работать, но в зависимости от количества строк и других вещей, которые я не знаю, могут быть лучшие решения.