03. november 2005 - 14:51Der er
9 kommentarer og 1 løsning
ADO Error fejl i når jeg forsøger mig med UNION ALL
"ADO Error: Order by items must appear in the select list if the statement contains a UNION operator"
ja, det er den fejlmeddelelse der kommer. Jeg har også forsøgt at sætte order by i den anden select statement som er under UNION med det hjalp ingenting
det er bare en eksempel, min query er MEGET større, derfor skrev jeg den lille der. Men jeg kan ikek engang gemme, så kommer den med fejlmeddelelsen. Og nej, jeg har ikke kørt den gennem query analyzer. Faktisk så er det første gang jeg beskæftiger mig med UNION så jeg tog bare en kopi af den øverste query i den tro at hvis de er ens så skal det nok køre. Jeg tester lige i analyzer.
/*select earliest startdate from the bought service purchases. This is used as creation date for first ProgresionReport*/ INSERT INTO @ServicePurchaseStartDates SELECT MIN(SP.StartDate), SP.SerialNumber FROM SinglePurchaseDeal SPD INNER JOIN ServicePurchase SP ON SPD.SerialNumber = SP.SerialNumber INNER JOIN SinglePurchaseDealStatus SPDS ON SPDS.SerialNumber = SPD.SerialNumber INNER JOIN ProviderManager PM ON SPD.ProviderID = PM.ProviderID AND PM.ProviderManagerID = @ID
GROUP BY SP.SerialNumber ORDER BY MIN(SP.StartDate) ASC
/*select latest enddate from the bought service purchases. This is used to check if active SPD should have been terminated */ INSERT INTO @ServicePurchaseEndDates SELECT MAX(SP.EndDate), SP.SerialNumber FROM SinglePurchaseDeal SPD INNER JOIN ServicePurchase SP ON SPD.SerialNumber = SP.SerialNumber INNER JOIN SinglePurchaseDealStatus SPDS ON SPDS.SerialNumber = SPD.SerialNumber INNER JOIN ProviderManager PM ON SPD.ProviderID = PM.ProviderID AND PM.ProviderManagerID = @ID
GROUP BY SP.SerialNumber ORDER BY MAX(SP.EndDate) DESC
SELECT Distinct SPD.SerialNumber, SPD.CitizenID, SPDS.Status, SPDS.ApproveDate3, CD.CitizenName, CD.CitizenSSN, /* finds the last date a progressionreport was filled - if none the date of earlist servicepurchase startdate */ ISNULL(( SELECT TOP 1 CreateDate FROM dbo.ProgressionReport WHERE (SerialNumber = SPD.SerialNumber) ORDER BY CreateDate DESC ),
(SELECT top 1 S.StartDate from @ServicePurchaseStartDates S where S.SerialNumber = spd.serialNumber)
) AS LastDate, /* Is the last report locked? */ ISNULL(( SELECT TOP 1 Locked FROM dbo.ProgressionReport WHERE (SerialNumber = SPD.SerialNumber) ORDER BY CreateDate DESC ),0) as Locked, /* number of days until next report is required */ DATEDIFF(dd,ISNULL(( SELECT TOP 1 CreateDate FROM dbo.ProgressionReport WHERE (SerialNumber = SPD.SerialNumber) ORDER BY CreateDate DESC ),SPDS.ApproveDate3), GETDATE()) - SPR.ReportInterval as DueDays, /* the date the next report has to be filled */ DATEADD(dd,SPR.ReportInterval,ISNULL(( SELECT TOP 1 CreateDate FROM dbo.ProgressionReport WHERE (SerialNumber = spd.SerialNumber) ORDER BY CreateDate DESC ),
(SELECT top 1 S.StartDate from @ServicePurchaseStartDates S where S.SerialNumber = spd.serialNumber)
)) As DueDate, SPED.EndDate AS LastServicePurchaseDate
FROM SinglePurchaseDeal SPD INNER JOIN SinglePurchaseDealStatus SPDS ON SPD.SerialNumber = SPDS.SerialNumber INNER JOIN CitizenData CD ON SPD.CitizenID = CD.CitizenID INNER JOIN ProviderManager PM ON SPD.ProviderID = PM.ProviderID AND PM.ProviderManagerID = @ID LEFT OUTER JOIN UserInfo UI ON SPD.ResponsibleProviderEmployeeID = UI.UserID LEFT OUTER JOIN ProviderEmployee PE ON PE.ProviderEmployeeID = SPD.ResponsibleProviderEmployeeID INNER JOIN SinglePurchaseReporting SPR ON SPR.SinglePurchaseReportMethodID = SPD.SinglePurchaseReportMethodID INNER JOIN ServicePurchase SP ON SPD.SerialNumber = SP.SerialNumber INNER JOIN KOMMAProject KP ON SP.KOMMAProjectID = KP.KOMMAProjectID INNER JOIN ProviderProjects PP ON KP.KOMMAProjectID = PP.KOMMAProjectID INNER JOIN Provider P ON PP.ProviderID = P.ProviderID INNER JOIN @ServicePurchaseEndDates SPED ON SPED.SerialNumber = SPD.SerialNumber
WHERE SPDS.Status = 3 AND SPED.EndDate < GETDATE()
UNION ALL
SELECT Distinct SPD.SerialNumber, SPD.CitizenID, SPDS.Status, SPDS.ApproveDate3, SPDS.ClosedDate, CD.CitizenName, CD.CitizenSSN, /* finds the last date a progressionreport was filled - if none the date of earlist servicepurchase startdate */ ISNULL(( SELECT TOP 1 CreateDate FROM dbo.ProgressionReport WHERE (SerialNumber = SPD.SerialNumber) ORDER BY CreateDate DESC ),
(SELECT top 1 S.StartDate from @ServicePurchaseStartDates S where S.SerialNumber = spd.serialNumber)
) AS LastDate, /* Is the last report locked? */ ISNULL(( SELECT TOP 1 Locked FROM dbo.ProgressionReport WHERE (SerialNumber = SPD.SerialNumber) ORDER BY CreateDate DESC ),0) as Locked, /* number of days until next report is required */ DATEDIFF(dd,ISNULL(( SELECT TOP 1 CreateDate FROM dbo.ProgressionReport WHERE (SerialNumber = SPD.SerialNumber) ORDER BY CreateDate DESC ),SPDS.ApproveDate3), GETDATE()) - SPR.ReportInterval as DueDays, /* the date the next report has to be filled */ DATEADD(dd,SPR.ReportInterval,ISNULL(( SELECT TOP 1 CreateDate FROM dbo.ProgressionReport WHERE (SerialNumber = spd.SerialNumber) ORDER BY CreateDate DESC ),
(SELECT top 1 S.StartDate from @ServicePurchaseStartDates S where S.SerialNumber = spd.serialNumber)
)) As DueDate
FROM SinglePurchaseDeal SPD INNER JOIN SinglePurchaseDealStatus SPDS ON SPD.SerialNumber = SPDS.SerialNumber INNER JOIN CitizenData CD ON SPD.CitizenID = CD.CitizenID INNER JOIN ProviderManager PM ON SPD.ProviderID = PM.ProviderID AND PM.ProviderManagerID = @ID LEFT OUTER JOIN UserInfo UI ON SPD.ResponsibleProviderEmployeeID = UI.UserID LEFT OUTER JOIN ProviderEmployee PE ON PE.ProviderEmployeeID = SPD.ResponsibleProviderEmployeeID INNER JOIN SinglePurchaseReporting SPR ON SPR.SinglePurchaseReportMethodID = SPD.SinglePurchaseReportMethodID INNER JOIN ServicePurchase SP ON SPD.SerialNumber = SP.SerialNumber INNER JOIN KOMMAProject KP ON SP.KOMMAProjectID = KP.KOMMAProjectID INNER JOIN ProviderProjects PP ON KP.KOMMAProjectID = PP.KOMMAProjectID INNER JOIN Provider P ON PP.ProviderID = P.ProviderID
WHERE (SPDS.Status > 3 AND DATEDIFF(dd, SPDS.ClosedDate, GETDATE()) <= 30)
Det eneste ORDER BY du har er i nogle subqueries, og det burde ikke gøre noget:
SELECT TOP 1 Locked FROM dbo.ProgressionReport WHERE SerialNumber = SPD.SerialNumber ORDER BY CreateDate DESC
Den burde kunne skrives sådan:
SELECT TOP 1 Locked FROM dbo.ProgressionReport WHERE SerialNumber = SPD.SerialNumber AND CreateDate = (SELECT Max(CreateDate) FROM dbo.ProgressionReport WHERE SerialNumber = SPD.SerialNumber)
Et skud i tågen, men prøv det alle steder der står ORDER BY
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.