Avatar billede hnteknik Novice
22. december 2006 - 23:45 Der er 2 kommentarer og
1 løsning

Problemer med Exists i Query efter migrering fra Access til MSSQL

En query som skal vise dagens tider for en frisør - både tagne og ikke tagne giver problemer i MS SQL efter at have funket upåklageligt:

Hele querien ser sådan ud efter at være converteret til MS SQL mht dato:

SELECT    TOP 100 PERCENT F.FrisoerName, BD.FrisoerID, C.CompanyName, BD.BookingDateCompanyID, BD.BookingDateID, BT.BookingTimeName,
                      BT.BookingTimeID, BT.BTType,
Exists
(SELECT B.BookingBookingDateID, B.BookingBookingTimeID FROM Booking AS B WHERE (((B.BookingBookingDateID)=BD.BookingDateID) AND B.BookingBookingTimeID= BT.BookingTimeID) ORDER BY B.BookingBookingTimeID; ) AS Taget

FROM        dbo.Company AS C INNER JOIN
                      dbo.BookingTime AS BT INNER JOIN
                      dbo.BookingDate AS BD LEFT OUTER JOIN
                      dbo.Frisoer AS F ON BD.FrisoerID = F.FrisoerID ON BT.BTType = BD.BTType ON C.CompanyID = BD.BookingDateCompanyID
WHERE    (BD.BookingDateCompanyID = 19) AND (CONVERT(CHAR(8), BD.BookingDateDate, 112) = '20061223') AND (BD.noview = 0)
ORDER BY F.FrisoerName, BD.BookingDateDate, BT.BookingTimeName

fjerner jeg, det skal give en bool om hvorvidt en tid er taget:

Exists
(SELECT B.BookingBookingDateID, B.BookingBookingTimeID FROM Booking AS B WHERE (((B.BookingBookingDateID)=BD.BookingDateID) AND B.BookingBookingTimeID= BT.BookingTimeID) ORDER BY B.BookingBookingTimeID; ) AS Taget

virker det upåklageligt  sql 2005, men hvad er galt med denne linie i sql 2005 men virker i Access ?

Er det fordi SQL 2005 løser querien på en anden måde, så den ikke forstår at BD og BT er tabeller i den ydre query. Eller er det den dobbelte binding ?

Fejlmeddelelsen er incorrect syntex near ekywords exists / order
Avatar billede dr_chaos Nybegynder
23. december 2006 - 09:27 #1
prøv at fjerne ';'

Jeg tror heller ikke helt det er lovligt at gøre:
Exists
(SELECT B.BookingBookingDateID, B.BookingBookingTimeID FROM Booking AS B WHERE (((B.BookingBookingDateID)=BD.BookingDateID) AND B.BookingBookingTimeID= BT.BookingTimeID) ORDER BY B.BookingBookingTimeID; ) AS Taget

Måske kan du gøre gøre noget i denne stil:

CASE
(SELECT 1 FROM Booking AS B WHERE B.BookingBookingDateID=BD.BookingDateID AND B.BookingBookingTimeID= BT.BookingTimeID)
WHEN 1 THEN 1 ELSE 0 END AS Target
Når du bruger subselects i sql server er SELECT 1 den hurtigste form for subselect.
Avatar billede hnteknik Novice
23. december 2006 - 11:50 #2
Respekt - den havde jeg ikke tænkt på. Jeg havde en anelse om, at exists ikke kunne bruges som en variable, som det tilsyneladende kan lade sig gøre i Access. Jeg havde selv i tankerne om IF kunen anvendes her, men du reddede min dag. Smid et fortjent svar - Tak og god jul
Avatar billede dr_chaos Nybegynder
23. december 2006 - 12:00 #3
svar :) tak i lige måde.
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