Avatar billede nio Nybegynder
18. december 2007 - 16:46 Der er 4 kommentarer og
1 løsning

Hjælp til Select query

Hej...
Jeg har en tabel som ser ca. sådan ud

@GUID Uniqueidentifier //PrimaryKey
@SerialNo nvarchar(30) //Unik for et stykke værktøj / Vare.
@HasReturned bit      //Indiker om værktøjet/varen er lejet ud.

I denne tabel kan der være flere rækker indeholdende den samme @SerialNo , @SerialNo identificer en unik stykke værktøj. Disse værktøjer lejes ud (@HasReturned = false). Når de kommer hjem igen @HasReturned = true.
Et stykke værktøj som er kommet hjem kan lejes ud igen, hvis dette sker indsættes en ny række i tabellen, med samme serialNo.

Der kan altid kun være en række (SerialNo) hvor @HasReturned = true.

Jeg skal nu lave en Select string som henter alle værktøjer ud af tabellen. Men jeg vil kun have 1 række pr. SerialNo. Findes der flere rækker med den samme SerialNo, vil jeg have rækken hvor @HasReturned = false, de andre rækker hvor @HasReturned = true skal den ikke tage med. (kun hvis der kun er 1 række med SerialNo = x, skal den tage rækken med selvom @HasReturned = true)

Håber der er nogen som har en løsning, som ikke indvolver en Cursor, da jeg skal bruge det i en enkelt Select!
Avatar billede the_party_dog Nybegynder
18. december 2007 - 17:15 #1
Hvis du ikke have valgt Uniqueidentifier, så kunne vi måske have løst det nemt med noget group by, MAX() og MIN() funktioner.

Er det nogen bestemmt grund til din Uniqueidentifier kolonne?
Avatar billede the_party_dog Nybegynder
18. december 2007 - 17:30 #2
Hvis tingene er som du beskriver dem, så burde dette kunne bringe dig et skridt i den rigtige retning:

Test data:
GUID | SerialNo | HasReturned
78FC93BC-2FB3-4571-B2E0-CC373F592786    1200-01    1
96B0B9E7-A1A4-41D9-8328-3BA605E5E616    1200-01    1
7556E6F7-1E40-458B-9982-89F0BBAE716B    1200-01    0
E3FA0589-C70E-4AB0-956F-C5EDF1C4C1BC    1200-02    1
21BB71ED-D14D-4931-9D1C-FC4D998CA05D    1200-02    0
79E04851-12C0-43AB-9938-8856144DE330    1200-03    1

SELECT [GUID], SERIALNO
FROM Table_1
WHERE HasReturned = 0

UNION ALL

SELECT [GUID], SERIALNO
FROM Table_1
WHERE SERIALNO IN ( SELECT SERIALNO
                    FROM Table_1
                    GROUP BY SERIALNO
                    HAVING MIN(CAST(HasReturned AS INT)) > 0
                    )
Avatar billede the_party_dog Nybegynder
18. december 2007 - 17:42 #3
Glemte vist lige den sidst kolonne:

SELECT [GUID], SERIALNO, HasReturned
FROM Table_1
WHERE HasReturned = 0

UNION ALL

SELECT [GUID], SERIALNO, HasReturned
FROM Table_1
WHERE SERIALNO IN ( SELECT SERIALNO
                    FROM Table_1
                    GROUP BY SERIALNO
                    HAVING MIN(CAST(HasReturned AS INT)) > 0
                    )
ORDER BY SERIALNO

Resultat:
GUID | SerialNo | HasReturned
7556E6F7-1E40-458B-9982-89F0BBAE716B    1200-01    0
21BB71ED-D14D-4931-9D1C-FC4D998CA05D    1200-02    0
79E04851-12C0-43AB-9938-8856144DE330    1200-03    1

Jeg glæder mig til at høre om det kan bruges, er tilbage onsdag.
Avatar billede nio Nybegynder
19. december 2007 - 09:15 #4
Hej
Det virker perfekt, så du får mange tak :)

Jeg havde glemt der var noget der hed Union :), men smid du bare et svar så du kan få nogle point.
Avatar billede the_party_dog Nybegynder
19. december 2007 - 09:19 #5
Der kommer et svar :o)
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