Avatar billede chrisrj Forsker
21. april 2005 - 09:58 Der er 15 kommentarer og
1 løsning

Hjælp til sql

Jeg har brug for lidt hjælp til lidt sql.

jeg skal finde et liste over medarbejdere der IKKE har registreret på en given dag.
Jeg kan godt finde medarbejderne på dagen, men jeg får ALLE medarbejderne, også dem der HAR registreret. Hvordan løser jeg det?

Min sql:
select distinct employeeday.workdayid,employee.id,employee.name from employeeday,employee where employeeday.workdayid=192 order by employee.name

Jeg arbejder forøvrigt i asp op imod en PostgreSQL(v. 8.0) db, hvis det skulle have noget at sige....

Sig endelig til, hvis du/I har behov for flere oplysninger.
Avatar billede fsconsult.dk Nybegynder
21. april 2005 - 10:02 #1
select from employee
where not employee.id in
(select employeeday.employeeid
from employeeday
where employeeday.workdayid=192)
Avatar billede chrisrj Forsker
21. april 2005 - 10:11 #2
Øh ja, det giver så en liste med de rigtige medarbejdere - de står der bare ca.20-30 gange hver :)

Sådan ser det ud nu:
select distinct employeeday.workdayid,employee.id,employee.name from employee where not employee.id in (select employeeday.employeeid from employeeday where employeeday.workdayid=192) order by employee.name
Avatar billede fsconsult.dk Nybegynder
21. april 2005 - 10:37 #3
hvis de står der 20-30 gange hver, betyder det jo at du har dem liggende 20-30 gange i employee !?

men distinct vil selvfølgelig gøre dem entydige ...
Avatar billede chrisrj Forsker
21. april 2005 - 10:39 #4
De ligger ikke flere gange i employee tabellen, men de er flere gange i employeeday tabellen.

Og ja, distinct hjalp da lidt på det. :)
Avatar billede fsconsult.dk Nybegynder
21. april 2005 - 10:46 #5
hmm...  jeg kender ikke postgresql, men hvis du bruger
  select from employee
  where not employee.id in
  (select employeeday.employeeid
  from employeeday
  where employeeday.workdayid=192)


så kan den ikke hente flere data ud end
  select from employee

medmindre der er en bug i postgressql, så den laver en join istedetfor en ægte subselect.  underligt.
Avatar billede chrisrj Forsker
21. april 2005 - 10:56 #6
Hvis jeg bruger den sql som den er, kommer der fejl fordi den første select er tom.

Hvorvidt postgresql laver joins eller ej - så må jeg være dig svar skyldig - for det aner jeg intet om. :-/
Avatar billede chrisrj Forsker
21. april 2005 - 12:31 #7
Er du gået kold for ideer? :)
Avatar billede fsconsult.dk Nybegynder
21. april 2005 - 12:43 #8
jeg troede din variant med distinct havde løst problemet.

jeg forstår heller ikke helt, at den første select er tom. hvis det er "select * from employee" du mener.

jeg har skrevet employee.id og employeeday.employeeid, men kender ikke de rigtige nøger/fremmednøgler i tabellerne til employee!

jeg formoder at employee tabellen burde indeholde en row for hver ansat, og employeeday en row per ansat per dag der er indrapporteret ... eller=
Avatar billede chrisrj Forsker
21. april 2005 - 12:59 #9
Nå, det forklarer jo det manglende svar ;)

"jeg forstår heller ikke helt, at den første select er tom. hvis det er "select * from employee" du mener."

Heh, det er nok fordi jeg havde bare taget den direkte, dvs. uden *. :)

Mine tabeller ser således ud:
CREATE TABLE employee
(
  id int8 NOT NULL,
  name varchar(255),
  fname varchar(50),
  lname varchar(50),
  email varchar(255),
  pwd varchar(50),
  departmentid int8,
  employeetypeid int8,
  CONSTRAINT employee_id PRIMARY KEY (id),
  CONSTRAINT department_fk FOREIGN KEY (departmentid) REFERENCES department (id) ON UPDATE RESTRICT ON DELETE RESTRICT,
  CONSTRAINT employeetype_fk FOREIGN KEY (employeetypeid) REFERENCES employeetype (id) ON UPDATE RESTRICT ON DELETE RESTRICT
)
WITHOUT OIDS;
ALTER TABLE employee OWNER TO brugernavn;
GRANT ALL ON TABLE employee TO brugernavn;
GRANT ALL ON TABLE employee TO brugernavn;

CREATE TABLE employeeday
(
  id int8 NOT NULL,
  employeeid int8 NOT NULL,
  workdayid int8 NOT NULL,
  arrival timestamp,
  departure timestamp,
  CONSTRAINT emplyeeday_id PRIMARY KEY (id),
  CONSTRAINT employee_fk FOREIGN KEY (employeeid) REFERENCES employee (id) ON UPDATE RESTRICT ON DELETE RESTRICT,
  CONSTRAINT workday_fk FOREIGN KEY (workdayid) REFERENCES workday (id) ON UPDATE RESTRICT ON DELETE RESTRICT
)
WITHOUT OIDS;
ALTER TABLE employeeday OWNER TO brugernavn;


"jeg formoder at employee tabellen burde indeholde en row for hver ansat, og employeeday en row per ansat per dag der er indrapporteret "
Jeps :)
Avatar billede fsconsult.dk Nybegynder
21. april 2005 - 13:26 #10
umiddelbart ville jeg mene at mit SQL burde virke, men enten har jeg overset noget, eller så opfører postgressql sig bare ikke som den burde iflg. min mening  :-/
Avatar billede chrisrj Forsker
21. april 2005 - 13:32 #11
Heh, tør jeg tillade mig at mene at det er dig der har overset noget..? :)

Forøvrigt - to af dem der kommer med har slet ikke registreret sig på nogen dage overhoved(dvs. de findes slet ikke i employeeday tabellen) - ændre det noget?
Avatar billede fsconsult.dk Nybegynder
21. april 2005 - 13:47 #12
en variation:

select e.* from employee e
where not exist
(select ed.employeeid
from employeeday ed
where ed.workdayid=192
and ed.employeeid=e.id)
Avatar billede chrisrj Forsker
21. april 2005 - 13:56 #13
Jeg får denne fejl:

syntax error at or near "select" at character 45
Avatar billede fsconsult.dk Nybegynder
21. april 2005 - 14:03 #14
mangler vist et s på exists:

select e.* from employee e
where not exists
(select ed.employeeid
from employeeday ed
where ed.workdayid=192
and ed.employeeid=e.id)
Avatar billede chrisrj Forsker
21. april 2005 - 14:08 #15
Stort, så virker det næsten! :D

Nu får jeg bare ikke workdayid med....
Avatar billede chrisrj Forsker
21. april 2005 - 14:09 #16
...men det er jo også ligemeget - det har jeg jo i min variabel. :)

Jeg takker for hjælpen!
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