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