Toon posts:

[Oracle/SQL] Select uit 3 tabellen mislukt

Pagina: 1
Acties:
  • 136 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo

Ik heb een query die in staat is om uit 3 tabellen gegevens te halen, deze werkt zonder problemen, maar nu zou ik nog een uitbreiding erbij moeten hebben en ik slaag er niet in om deze te maken.
Onderstaande query is de werkende en geeft het totaal aantal werkuren per project terug, alsook de projectnaarm, id en de leider.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT 
    copy_project.projname,
    copy_project.projid, 
    copy_project.projleader,
    sum(copy_work.worckblock) as total
FROM 
    copy_project,
    copy_work,
    copy_principal 
WHERE
    copy_work.workprojectid=copy_project.projid AND 
    copy_work.workprincipleid=copy_principal.prinid AND 
    copy_work.workdate BETWEEN to_date('12/01/2005','dd/mm/yyyy') AND to_date('12/02/2005','dd/mm/yyyy') 
GROUP BY 
    copy_project.projname,
    copy_project.projid, 
    copy_project.projleader

Nu is het dus de bedoeling dat ik ipv het leidersID de naam van de leider krijg. Dit getal komt overeen met prinid in de tabel copy_principal.
Ik dacht het als volgt op te lossen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT 
    copy_project.projname,
    copy_project.projid, 
    copy_project.projleader,
    copy_principal.prinname,
    sum(copy_work.worckblock) as total
FROM 
    copy_project,
    copy_work,
    copy_principal 
WHERE
    copy_principal.prinid=copy_project.projleader AND 
    copy_work.workprojectid=copy_project.projid AND 
    copy_work.workprincipleid=copy_principal.prinid AND 
    copy_work.workdate BETWEEN to_date('12/01/2005','dd/mm/yyyy') AND to_date('12/02/2005','dd/mm/yyyy') 
GROUP BY 
    copy_project.projname,
    copy_project.projid, 
    copy_project.projleader,
    copy_principal.prinname

Als ik dit probeer krijg ik een foutmelding dat het geen geldige SQLsyntax is.
Aangezien ik niet echt een sql-kenner ben heb ik geen idee wat er hieraan verkeerd is.

Hopelijk kunnen jullie me op de goede weg zetten.

[ Voor 4% gewijzigd door Verwijderd op 12-04-2005 14:47 ]


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 10:18

Dido

heforshe

is die laatste prindid een typo?

Wat betekent mijn avatar?


Verwijderd

Topicstarter
Dido schreef op dinsdag 12 april 2005 @ 14:42:
is die laatste prindid een typo?
Ja das idd een typfoutje, maar zonder typfout lukt het ook niet
Heb al geprobeerd om enkel het id van de leider uit de tabel te halen, maar zelfs dat gaat niet, dus de naam lukt ook niet.

Verwijderd

nog een typo?
sum(copy_work.worckblock) as total
work met ck


wat is de exacte fout die oracle je geeft?

Verwijderd

Topicstarter
Ja idd nog een foutje, is klein foutje, maar daar ligt het niet aan
Verwijderd schreef op woensdag 13 april 2005 @ 10:58:
wat is de exacte fout die oracle je geeft?
Krijg eigenlijk geen error, maar 1 leeg record, dat dus aangeeft dat er niets gevonden is.
Ondertussen net achterhaald hoe dat komt: sommige projecten hebben geen leiders aangewezen en hebben nu waarde 0, maar die waarde bestaat niet in de tabel copy_principal, dus krijgk ik niets terug 8)7

Dan maar over naar de volgende vraag (logischerwijze) :
is het mogelijk om de records waarbij er een leider is (dus waarde>0) de namen te laten weergen en de records met waarde 0 ook te tonen?
Indien het niet met 1 query kan (want dat vermoed ik toch), dan zal het maar met 2 moeten (waarbij ik eerst leiderid ophaal en indien groter dan nul query doe om naam eruit te halen)

Verwijderd

Outer joins is wat je zoekt

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT 
    copy_project.projname,
    copy_project.projid, 
    copy_project.projleader,
    copy_principal.prinname,
    sum(copy_work.worckblock) as total
FROM 
    copy_project,
    copy_work,
    copy_principal 
WHERE
    copy_principal.prinid(+)=copy_project.projleader AND 
    copy_work.workprojectid=copy_project.projid AND 
    copy_work.workprincipleid=copy_principal.prinid AND 
    copy_work.workdate BETWEEN to_date('12/01/2005','dd/mm/yyyy') AND to_date('12/02/2005','dd/mm/yyyy') 
GROUP BY 
    copy_project.projname,
    copy_project.projid, 
    copy_project.projleader,
    copy_principal.prinname


edit : copy_principal.prinid(+)=copy_project.projleader

de regel is : het plusje zetten aan de kant waar de record ontbreken, in dit geval de projectleiders

Verwijderd

Topicstarter
Helaas, met (+) erbij krijg ik nog steeds geen enkele rij terug :|

Edit:
met een andere query (die hetlzefde probleem had) lukt het wel :?
Nog efkes doorzoeken dus waar de fout zit.

[ Voor 48% gewijzigd door Verwijderd op 13-04-2005 13:09 ]


Verwijderd

Topicstarter
Echt niemand die nog een ideetje heeft waarom het niet werkt?

Verwijderd

copy_principal.prinid(+)=copy_project.projleader AND

moet je weglaten, omdat de koppeling met copy_principal al gelegd is via copy_work.

  • wallyberk
  • Registratie: Maart 2000
  • Laatst online: 07-05 09:23
De kolom prinid join je 2 verschillende kolomen uit 2 verschillende tabellen!
Waarschijnlijk staat in copy_project.projleader een andere persoon dan in copy_work.workprincipleid en dus komt er niets uit.

Dit zou wel moeten werken:
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
SELECT
    copy_project.projname,
    copy_project.projid, 
    copy_project.projleader,
    copy_principal_a.prinname,
    copy_principal_b.prinname,
    sum(copy_work.worckblock) as total
FROM 
    copy_project,
    copy_work,
    copy_principal copy_principal_a,
    copy_principal copy_principal_b
WHERE
    copy_project.projid       =               copy_work.workprojectid AND
    copy_project.projleader   =               copy_principal_a.prinid AND
    copy_work.workprincipleid =               copy_principal_b.prinid AND 
    copy_work.workdate        BETWEEN to_date('12/01/2005','dd/mm/yyyy')
                              AND           to_date('12/02/2005','dd/mm/yyyy') 
GROUP BY
    copy_project.projname,
    copy_project.projid, 
    copy_project.projleader,
    copy_principal_a.prinname,
    copy_principal_b.prinname

[ Voor 4% gewijzigd door wallyberk op 14-04-2005 22:17 ]


Verwijderd

Topicstarter
wallyberk schreef op donderdag 14 april 2005 @ 21:56:
De kolom prinid join je 2 verschillende kolomen uit 2 verschillende tabellen!
Waarschijnlijk staat in copy_project.projleader een andere persoon dan in copy_work.workprincipleid en dus komt er niets uit.

Dit zou wel moeten werken:
[...]
Dit was inderdaad het probleem, de koppeling tussen copy_work en copy_principal is niet nodig en moest er dus vantussen.
De code die je gegeven hebt gaf wel niet het gewenste resultaat, maar ik ben er uiteindelijk wel geraakt door in mn eerste query de overbodige regel te verwijderen.

Was mss een stomme fout, maar kheb ondertussen al geleerd hoe (+) werkt wat dus positief is.
Hartelijk dank dus voor alle reacties.
Pagina: 1