[ORACLE SQL] Alias gebruikt , geen results meer.

Pagina: 1
Acties:

  • om3ega
  • Registratie: Maart 2001
  • Laatst online: 14:40
Ik heb een probleem waar ik nu echt niet meer uitkom..

Ik heb een bestaande Oracle database van HPOV Servicedesk , daarin zit een tabel met users ( SERVICEDESK.ITSM_PERSONS ) en een tabel met CALLS ( SERVICEDESK.ITSM_SERVICECALLS )

Een call heeft een ID : SER_ID

Een (lookup) field naar ITSM_PERSONS voor de gene die de call heeft aangemeld
SERVICEDESK.ITSM_SERVICECALLS.SER_CALLER_PER

En een (lookup) field naar ITSM_PERSONS voor de gene die de call in behandeling heeft.
SERVICEDESK.ITSM_SERVICECALLS.SER_ASS_PER_TO_OID

Zoals je ziet moet ik 2x in ITSM_PERSONS een persoon zoeken.
Ik dacht dat het wel zou lukken met deze query :

code:
1
2
3
4
5
6
SELECT * FROM SERVICEDESK.ITSM_SERVICECALLS, 
SERVICEDESK.ITSM_PERSONS CALLER , 
SERVICEDESK.ITSM_PERSONS ASSIGNEDTO 
WHERE SER_ID = '12' and 
CALLER.PER_OID = SERVICEDESK.ITSM_SERVICECALLS.SER_CALLER_PER and 
ASSIGNEDTO.PER_OID = SERVICEDESK.ITSM_SERVICECALLS.SER_ASS_PER_TO_OID


Ik zoek hier op Call 12

Je mag er van uit gaan dat alle velden die ik zoek bestaan. Waarom krijg ik dan 0 results terug. Wat ik op internet heb kunnen vinden is dat Oracle SQL op bovenstaande manier een Alias wil zien (de MySQL manier werkt niet)

Bovenstaande query werkte prima toen ik nog maar 1 person uit de person table wilde opvragen en dus geen gebruik maakte van de alias funktie.

Iemand nog een suggestie wat ik nog kan proberen?

Overigens roep ik de query aan via PHP.

PHP:
1
2
$s = OCIParse($c, $query);
OCIExecute($s, OCI_DEFAULT);

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Wat is '*' uit een join van 3 tabellen?
Zit het veld 'ser_id' maar in 1 van de tabellen?

Een tip: als je aliassen gebruikt, gebruik ze dan overal in de query.

Who is John Galt?


  • om3ega
  • Registratie: Maart 2001
  • Laatst online: 14:40
Het veld SER_ID zit alleen in SERVICEDESK.ITSM_SERVICECALLS , daar kan geen verwarring over bestaan.

Met joins ben ik nog niet zo goed thuis .. Wat bedoel je met je vraag?

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Een select * uit een join over 3 tabellen vind ik nogal slordig, bedenk wat je wilt selecteren en zet dat in je select list.

In principe moet je query kunnen werken, kijk toch nog eens naar je data.
Zijn SER_CALLER_PER en SER_ASS_PER_TO_OID wel gevuld bijvoorbeeld?

Ook opvallend is dat 'ser_id' een varchar moet zijn.

Who is John Galt?


  • flipm0
  • Registratie: September 2000
  • Laatst online: 14-11-2025
Als je een 'SELECT *' doet uit 3 tabellen waartussen je een inner-join hebt gedefinieerd, is dat niet erg netjes. Normaalgesproken zou je alleen de velden op moeten halen, die je daadwerkelijk wil gaan gebruiken.

Ik neem aan dat justmental bedoelt dat, wanneer je gebruik maakt van aliassen voor je tabellen, je dat consequent voor alle tabellen moet doen, en ze voor de duidelijkheid moet gebruiken voor alle velden die je ophaalt, ook degene die maar in 1 van de tabellen voorkomt, zoals SER_ID. je zou dan iets krijgen als volgt:

code:
1
2
3
4
5
6
7
8
9
SELECT  [ALIAS].[VELDNAAM]
,   [ALIAS].[VELDNAAM]
,   [ALIAS].[VELDNAAM]
FROM    SERVICEDESK.ITSM_SERVICECALLS CALL
,   SERVICEDESK.ITSM_PERSONS CALLER
,   SERVICEDESK.ITSM_PERSONS ASSIGNEDTO
WHERE CALL.SER_ID = '12'
and CALLER.PER_OID = CALL.SER_CALLER_PER
and ASSIGNEDTO.PER_OID = CALL.SER_ASS_PER_TO_OID

  • om3ega
  • Registratie: Maart 2001
  • Laatst online: 14:40
justmental schreef op woensdag 17 november 2004 @ 11:41:
Een select * uit een join over 3 tabellen vind ik nogal slordig, bedenk wat je wilt selecteren en zet dat in je select list.

In principe moet je query kunnen werken, kijk toch nog eens naar je data.
Zijn SER_CALLER_PER en SER_ASS_PER_TO_OID wel gevuld bijvoorbeeld?

Ook opvallend is dat 'ser_id' een varchar moet zijn.
Mijn query is nu nog klein , maar ik heb bijna alle velden nodig uit de * .. dus daarom leek het mij handiger om dat zo te doen.

SER_ID is een NUMBER(18) veld..

Je bedoelt dus te zeggen dat het niet gaat werken omdat het geen varchar is?

--

@ flipm0

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT 

CALL.SER_ID , 
CALLER.PER_OID, 
ASSIGNEDTO.PER_OID 

FROM SERVICEDESK.ITSM_SERVICECALLS CALL, 
SERVICEDESK.ITSM_PERSONS CALLER , 
SERVICEDESK.ITSM_PERSONS ASSIGNEDTO 

WHERE 

CALL.SER_ID = '12' and 
CALLER.PER_OID = CALL.SER_CALLER_PER and 
ASSIGNEDTO.PER_OID = CALL.SER_ASS_PER_TO_OID


geeft helaas ook No results found.
Zijn SER_CALLER_PER en SER_ASS_PER_TO_OID wel gevuld bijvoorbeeld?
Ja.. Bij elke call , dus ook bij 12 , zijn deze velden ingevuld.

[ Voor 32% gewijzigd door om3ega op 17-11-2004 11:51 ]


  • flipm0
  • Registratie: September 2000
  • Laatst online: 14-11-2025
om3ega schreef op woensdag 17 november 2004 @ 11:44:
[...]


Mijn query is nu nog klein , maar ik heb bijna alle velden nodig uit de * .. dus daarom leek het mij handiger om dat zo te doen.

SER_ID is een NUMBER(18) veld..

Je bedoelt dus te zeggen dat het niet gaat werken omdat het geen varchar is?
Een 'SELECT *' is zeker makkelijk, maar wanneer je de velden gewoon opnoemt, is het voor jezelf en eventuele anderen veel makkelijker om de query te lezen, omdat je bijvoorbeeld meteen kan zien welke gegevens je uit welke tabellen gebruikt. In jouw query vraag je alle velden op uit alle 3 de tabellen, waarvan 2 tabellen dezelfde zijn. Je krijgt die velden dus dubbel, wat de leesbaarheid verlaagt.

Die varchar2 -> number conversie is functioneel niet zo'n probleem, omdat Oracle die voor je zal doen, het verdient echter voor de volledigheid de voorkeur om die conversie zelf te doen.

  • flipm0
  • Registratie: September 2000
  • Laatst online: 14-11-2025
Ja.. Bij elke call , dus ook bij 12 , zijn deze velden ingevuld.
Bestaan de corresponderende records voor SER_CALLER_PER en SER_ASS_PER_TO_OID ook in ITSM_PERSONS?

  • om3ega
  • Registratie: Maart 2001
  • Laatst online: 14:40
flipm0 schreef op woensdag 17 november 2004 @ 11:57:
[...]


Bestaan de corresponderende records voor SER_CALLER_PER en SER_ASS_PER_TO_OID ook in ITSM_PERSONS?
Ja , 100% zeker weten. Ik heb namelijk met de hand deze velden al opgezocht om te kijken of ze daadwerkelijk bestaan :

SELECT * FROM SERVICEDESK.ITSM_PERSONS where PER_OID = 281478253052681

Hij gaf hier de juiste naam terug. Idem voor SER_ASS_PER_TO_OID

Ik begrijp nog niet goed wat jullie bedoelen met varchar2 -> number conversie
Moet ik dit in de query aanroepen?

Ik kan niet de tabel omvormen (read-only rechten) en ik denk dat het voor de database ook niet zo lekker is :)

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
En zijn beide wel gevuld? Zo niet, verdiep je dan toch maar wat meer in joins, want dan komt de outer join wel snel naderbij.

  • om3ega
  • Registratie: Maart 2001
  • Laatst online: 14:40
bigbeng schreef op woensdag 17 november 2004 @ 12:05:
En zijn beide wel gevuld? Zo niet, verdiep je dan toch maar wat meer in joins, want dan komt de outer join wel snel naderbij.
:) .. ok , ik zal me daar dan in moeten gaan verdiepen :) .. tot nu toe heb ik het altijd zonder kunnen doen.. of het de meest efficiente manier was laat ik in het midden :X .....

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

om3ega schreef op woensdag 17 november 2004 @ 12:04:
Ik begrijp nog niet goed wat jullie bedoelen met varchar2 -> number conversie
Moet ik dit in de query aanroepen?
Je zet ser_id = '12' in je query.
Met die quotejes geef je aan oracle aan dat je waarde een char is.
De kolom is echter een number, dus zit je koeien met paarden te vergelijken.

Intern zal Oracle dit omvormen naar to_char(ser_id) = '12', wat in dit geval ook werkt, maar wel negatieve gevolgen kan hebben op de performance.

Who is John Galt?

Pagina: 1