Ik heb een tabel met diverse documenten erin. Deze documenttabel is verbonden aan een klantentabel, zodat je weet welk document bij welke klant hoort. Ook is deze tabel aan een documenttype tabel gekoppeld. Nu wil ik een query bouwen die voor alle klanten het laatst gemaakte document ophaald die voldoet aan een bepaald documenttype. Afhankelijk van het documenttype kunnen er dus meerdere klanten worden opgehaald
Stel ik wil alle klanten ophalen met het laatst gemaakte pdf en word bestand
Ik dacht dat ik dit misschien kon oplossen door met MAX ( creationDate ) te werken in de where clause. Dit haalt echter te veel klanten op en wordt er blijkbaar niet op creationDate gelet. Dit komt waarschijnlijk omdat deze query niet goed omgaat met het documentType.
Wat ik ook kan doen is door het MAX ( createDate ) te laten schieten en de controleren op welk document het hoogste id heeft en deze te beschouwen als de laatst gemaakte maar dat vind ik een iets wat mindere oplossing. Wel kun je op deze manier op verschillende documenttypes zoeken. Zoiets als dit:
Deze laatste werkt wel maar is niet 100% waterdicht. Ik heb het idee dat er een makkelijkere oplossing is maar kan er niet op komen of vinden.
Stel ik wil alle klanten ophalen met het laatst gemaakte pdf en word bestand
code:
1
2
3
4
| customer documentName creationDate Klant A a.pdf 31-12-2004: 13:33 Klant A b.word 1-11-2004: 1:40 Klant B c.word 1-1-2005: 15:34 |
Ik dacht dat ik dit misschien kon oplossen door met MAX ( creationDate ) te werken in de where clause. Dit haalt echter te veel klanten op en wordt er blijkbaar niet op creationDate gelet. Dit komt waarschijnlijk omdat deze query niet goed omgaat met het documentType.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| SELECT
C1.name AS customer,
D1.documentName,
D1.creationDate,
DocumentType.name documentType,
FROM
Document D1
INNER JOIN
DocumentType
ON
D1.documentTypeID = DocumentType.id
INNER JOIN
xCustomerDocument x1
ON
D1.id = x1.documentID
INNER JOIN
Customer C1
ON
C1.id = x1.customerID
WHERE
D1.documentTypeID IN ( 6, 7 ) AND
D1.documentGenerated =
(
SELECT
MAX( D2.creationDate )
FROM
Document D2
INNER JOIN
xCustomerDocument x2
ON
x2.documentID = D2.id
INNER JOIN
Customer C2
ON
C2.id = x2.customerID
WHERE
D2.id = D1.id AND
C2.id = C1.id
) |
Wat ik ook kan doen is door het MAX ( createDate ) te laten schieten en de controleren op welk document het hoogste id heeft en deze te beschouwen als de laatst gemaakte maar dat vind ik een iets wat mindere oplossing. Wel kun je op deze manier op verschillende documenttypes zoeken. Zoiets als dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| ...
WHERE
-- BEGIN EDIT
D1.id =
(
SELECT
TOP 1 D2.id
FROM
Document D2
INNER JOIN
xCustomerDocument x2
ON
x2.documentID = D2.id
INNER JOIN
Customer C2
ON
C2.id = x2.customerID
WHERE
D2.documentTypeID = 6 AND
C2.id = C1.id
ORDER BY
D2.id DESC
) OR
D1.id =
(
SELECT
TOP 1 D2.id
FROM
Document D2
INNER JOIN
xCustomerDocument x2
ON
x2.documentID = D2.id
INNER JOIN
Customer C2
ON
C2.id = x2.customerID
WHERE
D2.documentTypeID = 7 AND
C2.id = C1.id
ORDER BY
D2.id DESC
) |
Deze laatste werkt wel maar is niet 100% waterdicht. Ik heb het idee dat er een makkelijkere oplossing is maar kan er niet op komen of vinden.
stp - PSN ID: stp_4