Avatar billede hnteknik Novice
23. april 2007 - 23:25 Der er 7 kommentarer og
1 løsning

Brug for et udtryk Brugt Ja/nej hvis user in subquery

Jeg ska l have slettet en lang række dubiøse brugere, men skal være sikker på at de ikke aktuelt er i brug.

denne SQl giver et brugbar resultat men er for langsom:

SELECT DISTINCT
                      dbo.[User].UserName, dbo.[User].UserID, dbo.[User].UserPhone, dbo.[User].UserPassword, dbo.[User].lastactive,
                      dbo.Booking.BookingUserID AS brugt
FROM        dbo.[User] LEFT OUTER JOIN
                      dbo.Booking ON dbo.[User].UserID = dbo.Booking.BookingUserID

her vises 'brugt' som userid hvis user har en booking ellers false, men et kvickt ja/nej eller 0/1 vha en case vil være perfekt, men


denne her dur ikke, da der returneres flere værdier

SELECT DISTINCT dbo.[User].UserName, dbo.[User].UserID, dbo.[User].UserPhone, dbo.[User].UserPassword, dbo.[User].lastactive, CASE
                          (SELECT    1
                            FROM          Booking AS B
                            WHERE      B.BookinguserID = userID) WHEN 1 THEN 1 ELSE 0 END AS brugt
FROM        dbo.[User]

Hvordan grejer man den ?
Avatar billede hnteknik Novice
23. april 2007 - 23:36 #1
Denne her ser dog ud til at virke - dog langsomt for 4000 kunder

SELECT DISTINCT dbo.[User].UserName, dbo.[User].UserID, dbo.[User].UserPhone, dbo.[User].UserPassword, dbo.[User].lastactive, CASE
                          (SELECT    1
                            WHERE      userID IN
                                                      (SELECT    BookinguserID AS userID
                                                        FROM          Booking)) WHEN 1 THEN 1 ELSE 0 END AS brugt
FROM        dbo.[User]
Avatar billede stoffer Nybegynder
24. april 2007 - 00:11 #2
"dubiøse" brugere. Er det dansk ord. Vil gerne vide det :).

Ved ikke om det er hurtigere det her...måske bare en anden måde at gøre det på:

SELECT dbo.[User].UserName, dbo.[User].UserID, dbo.[User].UserPhone, dbo.[User].UserPassword, dbo.[User].lastactive, Eksisterer
FROM dbo.[User]
LEFT OUTER JOIN (SELECT 1 as Eksisterer, BookinguserID FROM Booking) as bookings
ON bookings.BookinguserID = dbo.[User].UserID

------------

Her er en anden måde vha. UNION.
-- HER HENTES ALLE UD DER HAR RELATION
SELECT dbo.[User].UserName, dbo.[User].UserID, dbo.[User].UserPhone, dbo.[User].UserPassword, dbo.[User].lastactive, 1 as Exists
WHERE UserID IN (SELECT BookinguserID FROM Booking)
UNION
SELECT dbo.[User].UserName, dbo.[User].UserID, dbo.[User].UserPhone, dbo.[User].UserPassword, dbo.[User].lastactive, 0 as Exists
WHERE NOT UserID  IN (SELECT BookinguserID FROM Booking)
Avatar billede stoffer Nybegynder
24. april 2007 - 00:12 #3
Sidste glemte jeg lige FROM ...

SELECT dbo.[User].UserName, dbo.[User].UserID, dbo.[User].UserPhone, dbo.[User].UserPassword, dbo.[User].lastactive, 1 as Exists FROM dbo.[User]
WHERE UserID IN (SELECT BookinguserID FROM Booking)
UNION
SELECT dbo.[User].UserName, dbo.[User].UserID, dbo.[User].UserPhone, dbo.[User].UserPassword, dbo.[User].lastactive, 0 as Exists FROM dbo.[User]
WHERE NOT UserID  IN (SELECT BookinguserID FROM Booking)
Avatar billede hnteknik Novice
25. april 2007 - 18:59 #4
Hej Stoffer. Dit script fejler i konstruktionen exists .... where
Jeg tror, at jeg holder mig til case udgaven foroven som dog virker.
Avatar billede stoffer Nybegynder
25. april 2007 - 19:04 #5
Exists er nok et reserveret ord... prøv [Exists]
Avatar billede stoffer Nybegynder
25. april 2007 - 19:05 #6
SELECT dbo.[User].UserName, dbo.[User].UserID, dbo.[User].UserPhone, dbo.[User].UserPassword, dbo.[User].lastactive, 1 as [exists] FROM dbo.[User]
WHERE UserID IN (SELECT BookinguserID FROM Booking)
UNION
SELECT dbo.[User].UserName, dbo.[User].UserID, dbo.[User].UserPhone, dbo.[User].UserPassword, dbo.[User].lastactive, 0 as [exists] FROM dbo.[User]
WHERE NOT UserID  IN (SELECT BookinguserID FROM Booking)
Avatar billede hnteknik Novice
25. april 2007 - 19:23 #7
Du har ret - det var vel også mig, som fokuserede på EXISTS IN som en mulighed.
Det virker og vist nok en lille smule hurtigere end CASE delen, som må ud i en DISTINCT. Kast et svar. Tsk for hjælpen
Avatar billede stoffer Nybegynder
25. april 2007 - 19:32 #8
så lidt....
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