Avatar billede sunezapa Nybegynder
09. november 2003 - 12:03 Der er 9 kommentarer og
1 løsning

erstatning for FIRST som ikke virker på ORDERed query

Hvis man bruger FIRST i en SELECT som henter fra en anden forespørgsel (som er sorteret!), så forventede jeg at der returneredes een record = den første i forespørgslen.
Men det gør der bare ikke - der hentes den første i ID-rækkefølgen (altså den fysiske indtastnings-rækkefølge) :-(
Dette har jeg fået verificeret via nyhedsgrupper på Google.
Løsningsforslag har været:
- bruge MAX istedet for ORDER+FIRST  (virker ikke, da jeg sorterer efter 2 felter)
- håndtere FIRST i asp-kode istedet for via SQL (virker sådan set (jeg kan godt vise en korrekt listning) - bortset fra at jeg OGSÅ skal kunne lave filter/search på det felt som hentes via "FIRST" - og så bliver det lidt tungt også at håndtere denne filter-funktion i ASP for alle records... men muligt, og nødløsningen.

jeg har i kreativ naivitet forsøgt:
- at hente et felt ind i en SELECT via en anden SELECT, hvor den anden bruger en TOP 1 til at tage den første... (men WHERE-kriteriet i den anden SELECT er desværre statisk og skifter altså ikke til kriteriet i den første SELECT)
- at eksekvere en Query med parameter inde fra en SELECT (dette kan man overhovedet ikke i Access-SQL...)

Her er noget kode (simplificeret ganske voldsomt).

1. en tabel med guides og datoer
SELECT GuideID, GuideNavn FROM tblGuide WHERE tblGuide.TourID=n ORDER BY GuideDate, GuideTime

2. et overblik over alle rejser (skal kunne filtreres/search'es)
SELECT Tourdata, GuideID, GuideNavn FROM tblTour JOIN etc...

opgaven er så
ENTEN kun at få een record for hver Tour i nr. 1 (ville jo gerne ha'  "SELECT FIRST(guide) FROM..." til at virke her)
ELLER at 2'eren kun henter den første Guide for hver Tour.

mere kode - ikke så simpelt, men stadig redigeret...
nr. 1 - returnerer alle guides - jeg ville her blive glad for kun een for hver Tour...

[viewTourGuide]
SELECT tblTour.TourID, tblSuppliers.SupplierNavn
FROM tblTour INNER JOIN (tblSupplierType INNER JOIN (tblSuppliers INNER JOIN (tblDay INNER JOIN tblService ON tblDay.DayID = tblService.ServiceDayID) ON tblSuppliers.SupplierID = tblService.ServiceSupplierID) ON tblSupplierType.SupplierTypeID = tblSuppliers.SupplierSupplierTypeID) ON tblTour.TourID = tblDay.DayTourID
WHERE (((tblSupplierType.SupplierTypeNavn)="guide"))
ORDER BY tblTour.TourID, tblDay.DayDate, tblService.ServiceTid;

RESULT: viewTourGuide
ID Guide
-- -------------
*17 Alice
17 Gry
17 Bryggen Guideservice
17 Guidekompagniet
*61 Bernard
61 Philippe
61 Anne Marie
61 Bergenguideservice
*68 Gry 
68 Bryggen Guideservice
68 Guidekompagniet
"*" er hvad jeg ønsker returneret.

nr.2 - returnerer alle Tour's - incl. turens Guide, - herunder skrives kun hvad jeg forsøgte for at hente den første guide for hver tur:
", IIf(IsNull(First([viewTourGuide].[SupplierNavnKort])),'',First([viewTourGuide].[SupplierNavnKort])) AS Guide, "
der retureneres forkerte Guides fordi FIRST ikke virker efter hensigten:

viewTourOverview
ID Guide
-- ---------
17 Gry
61 Philippe
65
66
68 Gry

mine desperate forsøg:
-at få nedenstående til at levere data til "nr 2":
PARAMETERS [@ID] Long;
SELECT TOP 1 viewTourGuide.ServiceID AS GuideID, viewTourGuide.SupplierNavnKort AS Guide
FROM viewTourGuide
WHERE (((viewTourGuide.TourID)=[@ID]));
men man kan vist slet ikke aflevere parametere fra een SELECT til en anden i Access-SQL... :-(

- og det første desperate forsøg - hvor svært kan det være - men der returneres kun den samme guide for alle ture :-(
SELECT
    tblTour.TourID,
    tblTour.TourNavn,
    (SELECT TOP 1 viewTourGuide.SupplierNavnKort FROM viewTourGuide WHERE viewTourGuide.TourID=tblTour.TourID) AS Guide
FROM tblTour; 

Forespørgsel2
ID Guide
-- ---------
17 Alice
61 Alice
65 Alice
66 Alice
68 Alice


Og til sidst - min drøm:
viewTourOverview SOM DEN SKAL VÆRE
ID Guide
-- --------
17 Alice
61 Bernard
65
66
68 Gry
Avatar billede terry Ekspert
09. november 2003 - 12:24 #1
try using TOP 1
Avatar billede terry Ekspert
09. november 2003 - 12:26 #2
I will take a look if you want? NOSPAMeksperten@santhell.dkNOSPAM



you need to remove NOSPAM
Avatar billede sunezapa Nybegynder
09. november 2003 - 15:34 #3
posted...
Avatar billede terry Ekspert
09. november 2003 - 20:01 #4
SELECT tblTour.TourID, (SELECT TOP 1 tblSuppliers.SupplierNavn
FROM tblSupplierType INNER JOIN (tblSuppliers INNER JOIN (tblDay INNER JOIN tblService ON tblDay.DayID = tblService.ServiceDayID) ON tblSuppliers.SupplierID = tblService.ServiceSupplierID) ON tblSupplierType.SupplierTypeID = tblSuppliers.SupplierSupplierTypeID
WHERE (((tblDay.DayTourID)=[tblTour].[TourID]) AND ((tblSupplierType.SupplierTypeNavn)='guide'))
ORDER BY tblService.ServiceID;
) AS Guide
FROM tblTour;
Avatar billede sunezapa Nybegynder
09. november 2003 - 20:12 #5
Yes - of course - Put the whole thing in the "inner" SELECT :-)
I just chnaged the ORDER to
"  ORDER BY tblTour.TourID, tblDay.DayDate, tblService.ServiceTid;"
then it is there :-D  - I like programming (again)!
Avatar billede sunezapa Nybegynder
09. november 2003 - 20:17 #6
an extra: 
I guess, that I will have to use a complete "inner" SELECT for each field I need - i.e. I do also need the GuideID (tblService.ServiceSupplierID), so I repeat the whole thing returning the ID instaead of the name...
Avatar billede sunezapa Nybegynder
09. november 2003 - 20:22 #7
Hmmm - Problem  - when I put the SELECT in the ViewTourOverviwew
Access tell something new (for me):  "Query too Complex" ! - what is Microsoft doiiiing...?
Avatar billede terry Ekspert
09. november 2003 - 20:47 #8
SELECT tblTour.TourID, (SELECT TOP 1 tblSuppliers.SupplierNavn
FROM tblSupplierType INNER JOIN (tblSuppliers INNER JOIN (tblDay INNER JOIN tblService ON tblDay.DayID = tblService.ServiceDayID) ON tblSuppliers.SupplierID = tblService.ServiceSupplierID) ON tblSupplierType.SupplierTypeID = tblSuppliers.SupplierSupplierTypeID
WHERE (((tblDay.DayTourID)=[tblTour].[TourID]) AND ((tblSupplierType.SupplierTypeNavn)='guide'))
ORDER BY tblService.ServiceID;
) AS Guide, (SELECT TOP 1 tblSuppliers.SupplierID
FROM tblSupplierType INNER JOIN (tblSuppliers INNER JOIN (tblDay INNER JOIN tblService ON tblDay.DayID = tblService.ServiceDayID) ON tblSuppliers.SupplierID = tblService.ServiceSupplierID) ON tblSupplierType.SupplierTypeID = tblSuppliers.SupplierSupplierTypeID
WHERE (((tblDay.DayTourID)=[tblTour].[TourID]) AND ((tblSupplierType.SupplierTypeNavn)='guide'))
ORDER BY tblService.ServiceID;
) AS GuideID
FROM tblTour;
Avatar billede terry Ekspert
09. november 2003 - 20:49 #9
Yes you will need to make a sub select for each field. This is becaus eyou only want one value out of many!
Avatar billede sunezapa Nybegynder
09. november 2003 - 21:23 #10
Done it - works - thanks ! (still I use ORDER BY Date + Time).

As I also have to have "something" in all records (cause a search/WHERE is used) I add a IIF-thing - so all those "inner" SELECTS comes then 2 times for each field - quit a long SQL-string - but no problem -(at least not with the 5 records in the test database ;-)
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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