Newsgroup: it.comp.software.database
Titolo: Vista con union all

dovrei creare una vista che prende dati da due tabelle (una che ha un
campo valorizzato, una che non lo contiene e quindi vorrei avere un
NULL)
create or replace view trebbi_prova as
select 1 n from dual
union all
select null n from dual
mi da' il seguente errore:
ORA-01790: expression must have same datatype as corresponding
expression
cosi' invece funziona:
create or replace view trebbi_prova as
select to_char(1) n from dual
union all
select null n from dual
Il problema e' che poi devo fare delle:
select * from trebbi_prova where n=1
che mi risultano molto lente.
Una soluzione potrebbe essere indicizzare to_char(n) nella tabella
originaria, ma mi chiedevo se non c'e' un sistema per avere il campo
come numerico nella vista e non applicarci nessuna funzione.
Greetings,
Alessandro Trebbi
Pesaro, Italy
http://www.b3soft.com

 che mi risultano molto lente.
e perchè mai?
è un caonversione implicita del database anche se utilizzassi
la sintassi to_char per creare la view puoi sempre utilizzare
un numerico...
lo overhead di una funzione è trascurabile a meno che tu non debba
farti tornare una sbrodolata enorme di dati...
forse non capisco bene il tuo problema
cmq dai un'occhiata
- alla salute del tuo dibbi (non può essere lento come dici su una
vista banalissima)
- se usi 8.x+ agli indici funzionali (crei un indici su un campo
applicando una funzione nel tuo caso to_char o to_number)
/G

...
Il problema e' che, per come e' fatta la vista, quello che vado a fare
con una query come quella indicata e' essenzialmente una:
... where to_char(n)=1
come ho detto ho un grosso problema di prestazioni, che potrei
risolvere parzialmente con l'indice su funzione, ma quello che vorrei
ottenere e' togliere quel to_char() che mi manda in full scan sulla
tabella
la vista non e' ovviamente quella che ho messo nell'esempio, l'indice
sulla funzione (vedi mio messaggio originale) era una possibile
soluzione che avevo gia' indicato ma che pero' avrei voluto evitare.
voglio un modo per poter togliere quel to_char()
Greetings,
Alessandro Trebbi
Pesaro, Italy
http://www.b3soft.com


 voglio un modo per poter togliere quel to_char()
posta la vista da te creata con le tue tabelle
è impossibile darti delle risposte senza avere sotto mano il
problema reale
/G

 problema reale
questa e' la vista finale, che si basa su altre viste; ti risparmio
tutto il resto. Fondamentalmente, ci sono dei campi numerici
valorizzati da una parte e null nell'altra...
la query che mi da' problemi e' quella con "... where
v2_id_apparato=x", per i motivi gia' detti
CREATE OR REPLACE VIEW V_COMP_TELAIO_SUB_APP AS 
SELECT 
v1.id_telaio
, v1.id_subtelaio
, v1.livello_di_inizio_subtelaio
, v1.stato_sub_telaio
, v1.intervento
, v1.progressivo_livello
, v1.num_livelli
, v1.num_liv_occupati
, v1.stato_sub_telaio_isaf
, v1.cod_stato
, v1.progressivo_sublivello
, v1.occupazione
, v1.id_ute
, v1.LIVELLO_LOGICO
, v1.PROGRESSIVO_LIVELLO_OR
, v1.NUM_LIV_OCCUPATI_OR
-- x_ori e y_ori dello slot (da v1) sono in generale diverse da quelle
dell'apparato (v2)
-- riduzione_smontato vale 0.5 per gli apparati smontati, 0.0 per gli
altri
, ROUND(riduci_apparato(v1.x_ori + (1 - atst.num_slot_rif) *
v1.larghezza_slot,'X_ORI',v2.riduzione_smontato -
v1.riduzione_smontato)
      ,2) x_ori
, ROUND(riduci_apparato(v1.y_ori,'Y_ORI',v2.riduzione_smontato -
v1.riduzione_smontato)
      ,2) y_ori
, ROUND(riduci_apparato(v1.larghezza_slot,'LARGHEZZA_SLOT',v2.riduzione_smontato
- v1.riduzione_smontato)
      ,2) larghezza_slot
, ROUND(riduci_apparato(v1.altezza_slot,'ALTEZZA',v2.riduzione_smontato
- v1.riduzione_smontato)
      ,2) altezza_slot
, TO_CHAR(v1.id_subtelaio) v2_id_subtelaio
, TO_CHAR(v2.id_apparato)  v2_id_apparato
, v2.stato_apparato
, v2.intervento v2_intervento
, v2.cod_app
, v2.cod_cla_app
, v2.cod_tip_app
, TO_CHAR(atst.num_sub_occ_sub)           num_sub_occ_sub
, v2.stato_app_isaf
, v2.stato_tirks
, TO_CHAR(v2.e_servizi)                 e_servizi
, TO_CHAR(v2.e_allarmi)                 e_allarmi
, TO_CHAR(v2.e_tributari)               e_tributari
, TO_CHAR(v1.progressivo_sublivello)    v2_progressivo_sublivello
, v1.MOD_GAT
    ,v1.TEXT
    ,v1.BORDO_RGB
    ,v1.BORDO_PESO
    ,v1.BORDO_STILE
    ,v1.SFONDO_RGB
    ,v1.SFONDO_STILE
,v1.G_TYPE
,TO_CHAR(v2.n_tributari_t_r)               n_tributari_t_r
,TO_CHAR(v2.n_tributari_t_altro)               n_tributari_t_altro
,TO_CHAR(v2.n_tributari_u_k)               n_tributari_u_k
,TO_CHAR(v2.n_tributari_u_altro)               n_tributari_u_altro
,v1.LARGHEZZA_SUBTEL
,v1.ALTEZZA_SUBTEL         
,v1.X_ORI_SUBTEL           
,v1.Y_ORI_SUBTEL   
FROM v_comp_telaio_subtelaio v1,
 vp_comp_subtelaio_apparato v2,
 APP_TRASMI_SUB_TEL atst
WHERE v1.id_sublivello_subtelaio=v2.id_sublivello_subtelaio
    AND atst.cod_app = v2.cod_app AND atst.cod_subtelaio =
v1.cod_subtelaio
UNION ALL
SELECT 
v1.id_telaio
, v1.id_subtelaio
, v1.livello_di_inizio_subtelaio
, v1.stato_sub_telaio
, v1.intervento
, v1.progressivo_livello
, v1.num_livelli
, v1.num_liv_occupati
, v1.stato_sub_telaio_isaf
, v1.cod_stato
, v1.progressivo_sublivello
, v1.occupazione
, v1.id_ute
, v1.LIVELLO_LOGICO
, v1.PROGRESSIVO_LIVELLO_OR
, v1.NUM_LIV_OCCUPATI_OR
, ROUND(v1.x_ori,2) x_ori
, ROUND(v1.y_ori,2) y_ori
, ROUND(v1.larghezza_slot,2) larghezza_slot
, ROUND(v1.altezza_slot,2) altezza_slot
,NULL, NULL, NULL, NULL ,NULL, NULL ,NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL -- 14 campi
, v1.MOD_GAT
    ,v1.TEXT
    ,v1.BORDO_RGB
    ,v1.BORDO_PESO
    ,v1.BORDO_STILE
    ,v1.SFONDO_RGB
    ,v1.SFONDO_STILE
,v1.G_TYPE
,NULL               n_tributari_t_r
,NULL               n_tributari_t_altro
,NULL               n_tributari_u_k
,NULL               n_tributari_u_altro
,v1.LARGHEZZA_SUBTEL
,v1.ALTEZZA_SUBTEL         
,v1.X_ORI_SUBTEL           
,v1.Y_ORI_SUBTEL   
FROM v_comp_telaio_subtelaio v1;

 valorizzati da una parte e null nell'altra...
è una vista che si basta su un'altra vista...?? andiamo bene
[...]
ho capito... prova col proverbio cinese:
se la montagna non va a maometto...
maometto va alla montagna...
ovvero
Select 123 from dual
union
Select to_number(null) from dual
*a me funziona*...
che ti becca gli indici rimango ancora perplesso cmq...
in questo caso hai dei numerici sulla vista...
rifacci sapere...
/G