[SQL] Vervelende query....

Pagina: 1
Acties:

  • Toink
  • Registratie: Januari 2000
  • Niet online
Hoi,

Hier een (voor mij) LASTIGE query waar ik maar niet uitkom.

Wat ik wil bereiken:

Een lijst van reparatienummers van alle reparaties die als ooit gezette statusnummer 5 hebben. De status 6 mag dan niet bij deze statussen horen tenzij deze meer dan 5 dagen oud is. Hieronder mijn query:

SELECT DISTINCT [serviceadmin_TblRepair].[repairid], [serviceadmin_tblhistorie].[historieid]

FROM (serviceadmin_TblRepair INNER JOIN serviceadmin_TblHistorie ON [serviceadmin_TblRepair].[repairid]=[serviceadmin_TblHistorie].[repairID])

WHERE (serviceadmin_TblRepair.repairid Not In (
select serviceadmin_tblrepair.repairid
from serviceadmin_tblrepair inner join serviceadmin_tblhistorie on serviceadmin_tblrepair.repairid = serviceadmin_tblhistorie.repairid
WHERE (serviceadmin_tblhistorie.statusid in (6))))

AND ((serviceadmin_TblHistorie.statusID in (5)))

ORDER BY [serviceadmin_TblRepair].[repairid] DESC;

Overige info:

Tabel serviceadmin_tblrepair heeft als PK: repairid
Tabel serviceadmin_tblhistorie heeft als PK: historieid



Wat mist er nog aan deze query? Nou in principe werkt deze maar ik mis het stuk waar hij controleert of het MAXIMALE historieid wat bij een reparatie hoort ouder dan 5 dagen is en gelijk is aan statusid=6. De datum staat in het veld tblhistorie.timestamp....

Hopelijk is deze info duidelijk anders edit ik nog wel wat raak.

Wie kan mij helpen?

Verwijderd

hmm...

Gewoon ff in access nagemaakt, dus vervang Now() naar believen met datum/tijd... daar komt dit uit:
code:
1
2
3
SELECT TblRepair.repairid, TblRepair.omsch, TblHistorie.timestamp, TblHistorie.statusid
FROM TblRepair INNER JOIN TblHistorie ON TblRepair.repairid = TblHistorie.repairid
WHERE (((TblHistorie.timestamp)<Now()-5) AND ((TblHistorie.statusid)=6)) OR (((TblHistorie.statusid)=5));

Makes sense, doesn't it :)

  • Toink
  • Registratie: Januari 2000
  • Niet online
Bedankt voor je reactie. Ik had de query aangepast zodat iedereen hem kon lezen maar blijkbaar heb ik daarin iets vergeten dat wel essentieel is voor de werking. De query zoals ik deze nu heb gaat als volgt:

SELECT DISTINCT [serviceadmin_TblRepair].[repairid], ORDER
KNIPPERDEKNIP
BY [serviceadmin_TblRepair].[repairid] DESC;

Query is geknipt omdat ik hieronder de oplossing al gevonden heb.

  • Toink
  • Registratie: Januari 2000
  • Niet online
SELECT DISTINCT reparatietabel.repairid, reparatietabel.contactingID, reparatietabel.probleemkort, klanttabel.name, klanttabel.address1, klanttabel.zip, klanttabel.address3, klanttabel.phone, klanttabel.phone2, klanttabel.fax, klanttabel.bedrijf, klanttabel.contactpersoon, klanttabel.email

FROM (reparatietabel INNER JOIN reparatie_eventtabel ON reparatietabel.repairid=reparatie_eventtabel.repairID) INNER JOIN klanttabel ON reparatietabel.accountnumber=klanttabel.accountnumbernew

WHERE (reparatietabel.repairid Not In (
select reparatietabel.repairid
from reparatietabel inner join reparatie_eventtabel on reparatietabel.repairid = reparatie_eventtabel.repairid
WHERE (reparatie_eventtabel.statusid in (6,8,9,11,12,15))))

AND ((reparatietabel.innamefiliaalID)=1)

AND ((reparatie_eventtabel.statusID in (5, 7, 13, 14)))

or ((reparatie_eventtabel.timestamp<Now()-14) AND (reparatie_eventtabel.repairid in (SELECT reparatietabel.repairid FROM reparatietabel WHERE (verlopen=0) and (((reparatietabel.repairid) Not In (select reparatie_eventtabel.repairid from reparatie_eventtabel where ((reparatie_eventtabel.repairid = reparatietabel.repairid) and (reparatie_eventtabel.statusid in (12,17,9))))) AND ((reparatietabel.filiaalID)=1 or (reparatietabel.innamefiliaalid)=getfiliaalnummer()))))) and (reparatie_eventtabel.statusid in (6,8,9,11,12,15))


Nou, deze doet 't in ieder geval wel. Tis nogal een lastige zoals je ziet.... bedankt Liez voor je hulp!!

/edit: enigzins leesbaarder ge-re-format...

De dagen moeten inderdaad 14 teruggeteld zijn.

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Leuke query, zonder database model zegt dit dus helemaal niets, het is onleesbaar neergegooid.

Better luck next time.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Mja, maar om nou te zeggend at het makkelijk is :)

  • Toink
  • Registratie: Januari 2000
  • Niet online
Na wat edits moet ie toch wel leesbaar zijn zo samen met de info van de eerste post.

Let wel: Mijn derde post bevat de oplossing dus het probleem is opgelost. Ik heb 'm geformat omdat iemand er misschien nog ooit iets aan heeft.

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 14-07 14:28

thomaske

» » » » » »

Misschien nog een tip in het algemeen om je queries wat korter en (dus) leesbaarder te maken.
code:
1
2
3
4
5
6
7
SELECT
   f.bel,
   f.stuur
FROM
   fiets f
WHERE
   f.aantalversnellingen = 3;

Je kan dus de tabelnaam afkorten, en deze afkorting in heel je query gebruiken..

HTH

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
SELECT DISTINCT 
  reparatietabel.repairid, 
  reparatietabel.contactingID,
  reparatietabel.probleemkort, 
  klanttabel.name, 
  klanttabel.address1, 
  klanttabel.zip, 
  klanttabel.address3, 
  klanttabel.phone, 
  klanttabel.phone2, 
  klanttabel.fax, 
  klanttabel.bedrijf, 
  klanttabel.contactpersoon, 
  klanttabel.email
FROM 
 (reparatietabel INNER JOIN reparatie_eventtabel ON reparatietabel.repairid=reparatie_eventtabel.repairID) 
  INNER JOIN klanttabel ON reparatietabel.accountnumber=klanttabel.accountnumbernew

WHERE (
  reparatietabel.repairid Not In (
    select 
    reparatietabel.repairid 
    from 
    reparatietabel 
    inner join reparatie_eventtabel on
    reparatietabel.repairid = reparatie_eventtabel.repairid
    WHERE (
      reparatie_eventtabel.statusid in (6,8,9,11,12,15)
    )
  )
) 
AND 
  (
    (reparatietabel.innamefiliaalID)=1
  ) 
AND 
  (
    (reparatie_eventtabel.statusID in (5, 7, 13, 14))
  )
OR 
  (
    (reparatie_eventtabel.timestamp<Now()-14) 
  AND 
    (
    reparatie_eventtabel.repairid in (
      SELECT 
        reparatietabel.repairid 
      FROM 
        reparatietabel 
      WHERE 
        (verlopen=0) 
      AND 
        (
        ((reparatietabel.repairid) Not In (
          SELECT 
            reparatie_eventtabel.repairid 
          FROM 
            reparatie_eventtabel  
          WHERE  
            (
            (reparatie_eventtabel.repairid = reparatietabel.repairid)  
            AND
            (reparatie_eventtabel.statusid in (12,17,9))
            )
          )
        ) 
        AND 
        (
          (reparatietabel.filiaalID)=1 
          OR 
          (reparatietabel.innamefiliaalid)=getfiliaalnummer()
        )
        )
    )
    )
  ) 
AND 
  (reparatie_eventtabel.statusid in (6,8,9,11,12,15))

Aangezien het blijkbaar erg moeilijk is voor sommige mensen om SQL code leesbaar neer te zetten heb ik het maar even geindent.

Als je nu ook naar de SQL code kijkt kan je verschillende fouten in deze query zien waardoor de query trager werkt dan het zou kunnen werken.

Niet dat andere mensen hier wat aan hebben zonder de database model die hierbij hoort.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Toink
  • Registratie: Januari 2000
  • Niet online
Hier bij t.net is dat inderdaad erg moeilijk omdat hij alle spaties en tabs blijkbaar verwijdert.

Dat de query traag werkt heb ik idd gemerkt. Misschien kun je me toelichten wat eraan mankeert dat ie zo langzaam is?

  • Toink
  • Registratie: Januari 2000
  • Niet online
Dusty, zou je mij aan kunnen geven wat er niet goed is aan die query aangezien je meldt dat er gegevens dubbelop instaan.

Mijn queryperformance is traag en hopelijk kun jij me helpen.

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Op dinsdag 04 juni 2002 11:41 schreef dusty het volgende:
code:
1
[...]

Aangezien het blijkbaar erg moeilijk is voor sommige mensen om SQL code leesbaar neer te zetten heb ik het maar even geindent.

Als je nu ook naar de SQL code kijkt kan je verschillende fouten in deze query zien waardoor de query trager werkt dan het zou kunnen werken.

Niet dat andere mensen hier wat aan hebben zonder de database model die hierbij hoort.
En haal dan ook even alle overbodige haakjes weg. Alias je tabelnamen, wat nu is er bijne geen wijs uit te worden. Bovendien wordt je statement veel korter en dus beter te lezen.
Pagina: 1