Toon posts:

[oracle] ambigu naam resolutie zonder

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

Verwijderd

Topicstarter
Voor een project voor school heb ik:
Een database in oracle, met daarin een aantal tabellen (duh!).
Een van die tabellen is genaamd lid.
Die tabel ondervragen lukt helemaal.
De query's worden met php dynamisch opgebouwd en werken volledig.
Nu zijn er een aantal views op die tabel gedefinieerd, die er leden uithalen uit een bepaalde leeftijdscategorie.
Als ik dus mijn lid tabel wil ondervragen aan de hand van die leeftijdscategoriën, worden eveneens die query's dynamisch opgebouwd.

vb:
select distinct * from volwassen where voornaam like 'Robin'

Dat werkt ook nog perfect, maar vanaf ik bijvoorbeeld ook de kleuters erbij wil, dan genereer ik zoiets:

select distinct * from kleuter, volwassen where voornaam like 'Robin'

(kleuter en volwassen zijn uiteraard views op de tabel lid)

En hier rijst het probleem, de voornaam is ambigu, vermits kleuter EN volwassen allebei een kolom voornaam hebben.
In standaard sql is dat zo opgelost met SELECT blabla AS, maar jeuj.... dit is oracle, en hier gaat dat niet :(

Kan het anders opgelost worden? OF ga ik op de presentatie maar gewoon zeggen dat ik er bewust voor gekozen heb dat je maar op 1 leeftijdscategorie kan zoeken per keer? >:)

[ Voor 5% gewijzigd door Verwijderd op 20-05-2004 15:20 . Reden: ik wou de titel aanpassen, maar dat lukt niet? en een typo ]


Verwijderd

Ik weet niet waarom je op die views aan het selecteren bent en hoe je datamodel in elkaar zit, maar daar lijkt het niet helemaal lekker te zitten. Sowieso is je query ook vraar, want je krijgt zo een cartesisch (spelling?) product van de records uit de 2 views. Ik denk dat je eerder een UNION zou willen doen met 2 queries over de aparte views. Nog beter is het als je gewoon alle leeftijdscategorieen in 1 tabel stopt en daar een query met de juiste condities op maakt ipv op views te queryen.

Met meer info over waarom je het zo doet zou ik misschien iets anders zeggen, dus geef meer info.

HTH :)

Verwijderd

Topicstarter
Alle leden zitten in dezelfde tabel hoor, de views zijn gewoon zo gedefinieerd:

CREATE VIEW Volwassen AS
SELECT lid.*, stad.stad
FROM lid
JOIN stad ON postcode = stad.postnr
WHERE (18 <= (SELECT trunc(to_number((SYSDATE - (geboortedatum))/365)) from dual) );

Voor de opdracht zijn we namelijk verplicht om views in de database te steken, de beste oplossing zou dan misschien wel zijn om die views niet te gebruiken. Maar daar dienen ze toch voor?

Verwijderd

Voor het nut van VIEWS, zie bijv. http://www.smart-soft.co....e-tuning-part4-vw-use.htm Ik kan me bijvoorbeeld wel voorstellen dat je een VIEW maakt die de JOIN van de Lid naar de Stad tabel maakt, maar dan dus zonder de leeftijdscategorieen.

Eventueel zou je wel een extra colom met de juiste categorie in je VIEW kunnen laten genereren aan de hand van de geboortedatum. Dan kun je op deze kolom filteren als je alleen bepaalde categorieen wil hebben.

HTH :)

Verwijderd

In standaard sql is dat zo opgelost met SELECT blabla AS, maar jeuj.... dit is oracle, en hier gaat dat niet
Goh, dat wist ik niet.....gek dat het in al die queries die ik hier heb wel werkt dan....

Verwijderd

Topicstarter
Verwijderd schreef op 20 mei 2004 @ 16:36:
[...]

Goh, dat wist ik niet.....gek dat het in al die queries die ik hier heb wel werkt dan....
Om even de cursus te quoten:
De queries die er in de cursus terug te vinden zijn, zijn geschreven in Standard SQL. In de practica wordt er gewerkt met Oracle, en een bijbehorend SQL dialect. Natuurlijk zijn er een aantal belangrijke verschillen. In onderstaand lijstje kan je enkele verschillen vinden die van toepassing zijn op de queries uit de cursus.
AS in FROM werkt niet in Oracle
EXCEPT moet in Oracle vervangen worden door MINUS
DOMAINS werken niet in Oracle
in ALTER moet de kolom die na DROP komt tussen ronde haken
type BIT werkt niet in Oracle als attribuut
i.p.v. SHORTINT gebruikt Oracle SMALLINT
query op p 162 wordt in Oracle gewijzigd: voor de REFERENCES moet er CONSTRAINT komen vb. ... INT NOT NULL CONSTRAINT name REFERENCES ...
ON UPDATE SET NULL wordt niet door Oracle ondersteund
REJECT wordt niet door Oracle ondersteund, het moet RESTRICT zijn en dit is default
CHECK laat geen subqueries toe in Oracle
CREATE CLUSTER INDEX heet in Oracle CREATE INDEX
zie p 173: de naam van een constraint moet voor de constraint komen vb. CONSTRAINT feminine CHECK (gender = F)
ASSERTIONS worden niet ondersteund door Oracle
p 176: standard SQL. In Oracle worden TRIGGERS totaal anders. Hiervoor verwijzen we naar onderstaande link.
INSTEAD OF bestaat niet in Oracle
Meer gedetailleerde informatie over de specifieke verschillen kunnen in dit document teruggevonden worden. Indien ook deze info niet voldoet, kan je meer info terug vinden in de Oracle PL/SQL User Guide.
En yep dat heb ik uitgeprobeerd en nee het gaat echt niet, misschien een andere versie van oracle?

Voorts: ik heb het ondertussen aan de praat gekregen door gewoon aparte queries per leeftijdscategorie aan te maken en dan in php te checken welke ik moet gebruiken, niet echt de properste manier, maar ze werkt wel.

Verwijderd

AS in FROM werkt niet in Oracle
Hier staat dus dat je geen AS kunt gebruiken in de FROM clause, en dat klopt. In Oracle kun je direct een alias achter je table zetten. je hebt het eerde echter over een AS in de SELECT clause, en dat behoort wel te werken.

Welke versie van Oracle gebruik je ? Ik weet pertinent zeker dat AS in de SELECT werkt in versie 8 en 9.

Verwijderd

Topicstarter
SQL*Plus: Release 9.2.0.1.0 - Production on Thu May 20 17:57:53 2004

In mijn voorbeeld heb ik toch de AS in de FROM clause nodig? of ben ik nu volledig aan't flippen?
Misschien heb ik me wat vaag uitgedrukt, dat komt wel meer voor bij mij...

  • General_Failure
  • Registratie: Oktober 2000
  • Laatst online: 20-05 15:14

General_Failure

Vrolijk Pasen!!!

Volgens mij moet de code "SELECT KLEUTER.VOORNAAM FROM KLEUTER, VOLWASSEN" werken, evenals "SELECT K.VOORNAAM FROM KLEUTER K, VOLWASSEN V".

Me and my dear friend General Protection-Error will invade your computer with our mighty army of Bugs. We will avoid the Firewall at the Gates of your PC by entering through your Windows.


Verwijderd

Topicstarter
Ja, dat werkt.... alleen doet dat niet wat ik moet hebben.
Als die query nog uitgebreid wordt dan is de voornaam (of andere velden) nog steeds ambigu gedefinieerd.

Verwijderd

Verwijderd schreef op 20 mei 2004 @ 17:59:
SQL*Plus: Release 9.2.0.1.0 - Production on Thu May 20 17:57:53 2004

In mijn voorbeeld heb ik toch de AS in de FROM clause nodig? of ben ik nu volledig aan't flippen?
Misschien heb ik me wat vaag uitgedrukt, dat komt wel meer voor bij mij...
ALs je bij Oracle 9 een Tabel alias wilt hebben, zet je de alias direct achter de tabelnaam.
code:
1
2
3
4
5
6
Select
  *
from
  Tabel1 A,
  Tabel1 B,
  Tabel2

Hier heb ik dus aliassen A en B, beide voor tabel1

Verwijderd

Topicstarter
Ow, dat wist ik niet, dat had men probleem wel een pak makkelijker gemaakt....
Onthouden voor de volgende keer, kga men code niet allemaal aanpassen nu, de tijd dringt :)

Toch bedankt!
Pagina: 1