[SQL] Correlated subquery

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • sjaakie
  • Registratie: Oktober 2000
  • Niet online

sjaakie

Developer

Topicstarter
Hallo!

Ik kom even niet uit een query en wellicht kan iemand een nieuw inzicht geven. We hebben een tijdregistratie (soort prikklok) systeem en we willen daar een lijst met alle werknemers uit halen met hun laatste "prik-actie". Even een vereenvoudigde weergave van het datamodel:

Employee
- EmployeeID
- Name

Clocking
- EmployeeID
- Date
- Time
- ....

Waarom de bouwer date en time gesplitst heeft is mij even een raadsel maar dat maakt verder ook niet uit.

Het doel is dus een lijst met alle medewerkers en hun datum + tijd van de laatste clock actie. Ik heb later nog meer gegevens nodig uit Clocking, maar dat komt dan wel. Het gaat overigens om een SQL Server database.

Wie kan me helpen?

Als je enige gereedschap een hamer is, ziet elk probleem eruit als een spijker...


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Laten we beginnen met Kan iemand even...? en onze Quickstart. Zoals je in die laatste zult lezen verwachten we namelijk wat eigen inzet en zien we dus graag wat je zelf al hebt geprobeerd/gezocht/gevonden etc. En daar zie ik niets van terug. En dat brengt je topic meteen weer bij de eerste link.

Je zult eens moeten gaan kijken naar Aggregate functies en Hoe werkt dat GROUP BY nu eigenlijk? mocht je dat nog niet gedaan hebben.

[ Voor 20% gewijzigd door RobIII op 24-08-2011 14:44 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Motrax
  • Registratie: Februari 2004
  • Niet online

Motrax

Profileert

sjaakie schreef op woensdag 24 augustus 2011 @ 14:42:
Waarom de bouwer date en time gesplitst heeft is mij even een raadsel maar dat maakt verder ook niet uit.
Sommige databases kennen alleen een datum veld, zonder tijd en een los tijd veld. Bijvoorbeeld DB2. Ook voor performance redenen kan het beter zijn om datum en tijd apart op te slaan, als je veel vaker queriet op datum dan op datumtijd. Als ontwikkelaar vind ik wel dat mijn leven moeilijker wordt gemaakt als datum en tijd los van elkaar wordt opgeslagen :-(

Datum en tijd bij elkaar voegen is niet zo spannend, even googlen:
SQL:
1
to_date(TO_CHAR(Date, 'yyyymmdd')||TO_CHAR(Time, 'hh24miss'),'yyyymmddhh24miss'); 

☻/
/▌
/ \ Analyseert | Modelleert | Valideert | Solliciteert | Generaliseert | Procrastineert | Epibreert |


Acties:
  • 0 Henk 'm!

  • daan.timmer
  • Registratie: Februari 2010
  • Laatst online: 07-09 13:19
@Motrax, enige jammere daarvan is, is dat je geen gebruik kan maken van indices die op de date en time velden staan.

Stel je bedrijf heeft 50medewerkers, ze werken allen 52weken per jaar 5dagen per week en klokken 's ochtends en 's middags in dan zit je na een jaar op 26000 records.
Afhankelijk van je query en server kan dit al een PITA zijn om te sorteren/zoeken/groupen zonder index.

Waarom doe je niet een pseudosql:
code:
1
select *, (select doehierdatetimecombineren from clocktimes where clocktimes.userid =users.userid orderby date,time DESC LIMIT 1) AS latesttime from users

Acties:
  • 0 Henk 'm!

  • sjaakie
  • Registratie: Oktober 2000
  • Niet online

sjaakie

Developer

Topicstarter
daan.timmer schreef op woensdag 24 augustus 2011 @ 15:04:
Waarom doe je niet een pseudosql:
code:
1
select *, (select doehierdatetimecombineren from clocktimes where clocktimes.userid =users.userid orderby date,time DESC LIMIT 1) AS latesttime from users
Zo had ik het in eerste instantie ook bedacht, maar aangezien ik meer kolommen nodig heb uit de kloktijden gaat dit niet werken aangezien je hier een single (scalar) value terug krijgt en niet de complete row.

Ik weet dat hier 2 methodes voor zijn; Correlated subqueries of met een join. Onder MySQL krijg ik dat meestal ook wel voor elkaar, maar onder SQL server werkt dat net allemaal ff anders.

Als je enige gereedschap een hamer is, ziet elk probleem eruit als een spijker...


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik zou gewoon een view maken als de 2 gescheiden velden je probleem is...

[ Voor 39% gewijzigd door RobIII op 24-08-2011 15:39 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Tom-my
  • Registratie: November 2000
  • Laatst online: 21-05 16:08

Tom-my

w03iz0rz

max en group by's? of zit ik echt te slapen

"Then there was the man who drowned crossing a stream with an average depth of six inches."


Acties:
  • 0 Henk 'm!

  • daan.timmer
  • Registratie: Februari 2010
  • Laatst online: 07-09 13:19
Dan doe je het anders (ik heb alleen kennis van MySql) geen idee heo het in (MS)SQLServer werkt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT  users.*
        somekindoftablename.*
FROM
    users,
    (
        SELECT
            date+time AS datetime,
            jeandere,
            velden
        FROM
            clocktijdentabel
        WHERE
            clcoktijdentabel.user_id = users.user_id
        ORDER BY
            date DESC, time DESC
        LIMIT 1
    ) AS somekindoftablename
ORDER BY
    somekindoftablename.datetime DESC


komt ipc op het zelfde neer als het goed is?

of dit inderdaad:
Tom-my schreef op woensdag 24 augustus 2011 @ 15:42:
max en group by's? of zit ik echt te slapen

[ Voor 15% gewijzigd door daan.timmer op 24-08-2011 15:44 ]


Acties:
  • 0 Henk 'm!

  • Tom-my
  • Registratie: November 2000
  • Laatst online: 21-05 16:08

Tom-my

w03iz0rz

ohja, mysql en limits, was het bijna vergeten :) , dense_ranken ! :P

"Then there was the man who drowned crossing a stream with an average depth of six inches."


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Motrax schreef op woensdag 24 augustus 2011 @ 14:50:
[...]
Ook voor performance redenen kan het beter zijn om datum en tijd apart op te slaan, als je veel vaker queriet op datum dan op datumtijd.
Je index wordt dan inderdaad kleiner. Een andere performancereden is dat je tijd apart kunt indexeren.
Pagina: 1