2017-01-13 6 views
0

У меня есть входной параметр для запроса, который я пытаюсь написать. В основном, if mostRecentSnapshot == true, тогда я хочу выбрать только самые последние записи из процесса (в основном where max(creationDate)) и if mostRecentSnapshot == false, затем select creationDate и другие столбцы нормально.Таблица запросов на основе входного параметра

Для меня имеет смысл сделать это заявление from, но я не думаю, что это возможно. Обычно я бы использовал CTE, но я этого не имею в MySQL.

Каков наилучший способ достичь этого?

Было бы что-то вдоль линий этого:

SELECT 
CASE mostRecentSnapshot WHEN FALSE THEN 
(
processauditheader.creationDate as processCreationDate, 
processauditheader.processName, 
processauditheader.processType, 
processauditheader.processHost, 
processauditheader.processDatabase, 
processauditheader.tableAudited, 
processauditheader.processInvokedByName, 
processauditheader.processInvokedByType, 
processauditheader.processInvokedByDatabase, 
processauditheader.processIntervalValue, 
processauditheader.processIntervalField, 
processauditheader.auditScenarios, 
processaudititerationdetail.creationDate as iterationDate, 
processaudititerationdetail.connectionId, 
processaudititerationdetail.processDate, 
processaudititerationdetail.tableRowCount, 
processaudititerationdetail.tableRowCountLastDay, 
processaudititerationdetail.previousProcessAuditIterationDetailID, 
processauditmetricdetail.creationDate, 
processauditmetricdetail.processAuditIterationDetailID, 
processauditmetricdetail.auditMetric, 
processauditmetricdetail.auditTotal, 
processauditmetricdetail.auditExample 
) 
WHEN TRUE THEN 
(
((SELECT MAX(processaudititerationdetail.creationDate) as maxSnapshot, 
processaudititerationdetail.id 
from reporting_audit.processaudititerationdetail 
group by processaudititerationdetail.creationDate) mostRecent 

JOIN reporting_audit.processaudititerationdetail ON mostRecent.id = processaudititerationdetail.id) 
) 
END 

FROM reporting_audit.processauditheader 

JOIN processaudititerationdetail ON processaudititerationdetail.processAuditHeaderID = processauditheader.id 
LEFT JOIN processauditmetricdetail ON processauditmetricdetail.processAuditIterationDetailID = processaudititerationdetail.id 

ответ

1

Запрос может возвращать только фиксированный набор столбцов. Возможно следующее делает то, что вы хотите:

select paid.* 
from reporting_audit.processaudititerationdetail paid 
where (not v_mostRecentSnapshot) or 
     paid.creation_date = (select max(paid2.creationDate from reporting_audit.processaudititerationdetail paid2); 

Это будет либо выбрать все записи из таблицы или только записи (ей), которые имеют самые последние creationDate.

+0

Вот что я придумал:... '' 'выберите заголовок * итерацию *, метрика * из reporting_audit.processauditheader заголовка присоединиться к processaudititerationdetail итерации на iteration.processAuditHeaderID = header.id покинул присоединиться processauditmetricdetail метрики metric.processAuditIterationDetailID = iteration.id где (не @mostRecentSnapshot) или iteration.processDate IN (выберите max (iteration2.processDate) from report_audit.processaudititerationdetail iteration2 GROUP BY iteration2.processAuditHeaderId) '' ' – Ted