Avatar billede harisk Nybegynder
03. november 2005 - 14:51 Der 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
Avatar billede harisk Nybegynder
03. november 2005 - 14:59 #1
Jeg skal lige huske og skrive at det den SP det drejer sig om er noget i stil med:

select name
from provider
where date > getdate()

union all

select name
from provider
where state = az

det er samme info, men forskellige where statements
Avatar billede 0xffff Nybegynder
03. november 2005 - 16:04 #2
kan ikke umiddelbart se noget galt med din query udover du bryder navnestandard. Hvis du vil bruge en kolonne der hedder name skal din query hedde:

select [name]from provider etc..

har du kørt den i query analyzer og se om den kører der ?
Avatar billede harisk Nybegynder
03. november 2005 - 16:09 #3
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.
Avatar billede harisk Nybegynder
03. november 2005 - 16:58 #4
det samme fejl får jeg også i analyzer :(
Avatar billede ldanielsen Nybegynder
03. november 2005 - 17:41 #5
Den siger jo faktisk at du har en ORDER BY med et kolonnenavn der ikke findes i selectlisten. Passer det ikke?
Avatar billede 0xffff Nybegynder
03. november 2005 - 18:14 #6
jeps, prøv at smide hele query over så vi kan se den i fuld længde. Kan ikke rigtigt hjælpe mere før vi ser den.
Avatar billede harisk Nybegynder
03. november 2005 - 18:24 #7
oki doki... her kommer den :)

/*   
    Created:    Haris Kamenica    03-11-2005           
*/

ALTER PROCEDURE dbo.SinglePurchaseDeal_GetSPDListPassTerminationDateFromProviderManagerID
(
    @ID int
)

AS

DECLARE @ServicePurchaseStartDates Table( StartDate datetime, SerialNumber nvarchar(18))
DECLARE @ServicePurchaseEndDates Table( EndDate datetime, SerialNumber nvarchar(18))


/*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)
       
   
RETURN
Avatar billede 0xffff Nybegynder
03. november 2005 - 18:47 #8
holy long query batman
Avatar billede ldanielsen Nybegynder
03. november 2005 - 20:04 #9
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
Avatar billede harisk Nybegynder
07. juni 2006 - 09:52 #10
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester