2017-01-13 5 views
0

Ich habe einen Eingabeparameter für eine Abfrage, die ich versuche zu schreiben. Grundsätzlich if mostRecentSnapshot == true dann möchte ich nur die jüngsten Datensätze aus dem Prozess ausführen (im Grunde where max(creationDate)) und if mostRecentSnapshot == false dann select creationDate und andere Spalten normalerweise.Abfragetabelle basierend auf Eingabeparameter

Für mich macht es Sinn, diese if Erklärung in der from Klausel zu tun, aber ich denke nicht, dass das möglich ist. Normalerweise würde ich ein CTE verwenden, aber ich existiere nicht in MySQL.

Was ist der beste Weg, dies zu erreichen?

Es wäre etwas entlang der Linien von diesem sein:

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 

Antwort

1

Eine Abfrage nur einen festen Satz von Spalten zurückgeben kann. Vielleicht ist die folgende tut, was Sie wollen:

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

Es wird entweder wählen Sie alle Datensätze aus der Tabelle oder nur die Eintragung (en), die die jüngsten creationDate haben.

+0

Hier ist, was ich kam mit:... '' 'select-Header *, Iteration *, metrisch * von reporting_audit.processauditheader Header processaudititerationdetail Iteration auf iteration.processAuditHeaderID = header.id verbinden links processauditmetricdetail metric kommen auf metric.processAuditIterationDetailID = iteration.id wo (nicht @mostRecentSnapshot) oder iteration.processDate IN (wählen Sie max (iteration2.processDate) aus reporting_audit.processaudititerationdetail iteration2 GROUP BY iteration2.processAuditHeaderId) '' ' – Ted

Verwandte Themen