Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Cómo poner nombres a consultas para el uso de joins

Estas en el tema de Cómo poner nombres a consultas para el uso de joins en el foro de Oracle en Foros del Web. Es decir, ponerle un nombre a una consulta entera para que cuando se utilice un join, se haga referencia a un elemento de una consulta ...
  #1 (permalink)  
Antiguo 11/08/2008, 05:57
 
Fecha de Ingreso: abril-2007
Mensajes: 160
Antigüedad: 17 años, 7 meses
Puntos: 1
Cómo poner nombres a consultas para el uso de joins

Es decir, ponerle un nombre a una consulta entera para que cuando se utilice un join, se haga referencia a un elemento de una consulta (en lugar de de una tabla. Algo como tabla1.campo2).

Lo he conseguido para la segunda consulta, pero no para la primera:

select * from (...) join (consulta2) t1 on...

Es decir, escribo t1 al lado de consulta2, pero no sé poner nombre a la primera consulta, y por tanto no sé si se puede referenciar bien (ya que ambas consultas son sobre la misma tabla y tienen nombres de campos iguales).

En concreto, lo que quiero es realizar un join de dos tablas (la consulta1), y después volver a realizar un join con la primera tabla para transformar unos valores que vienen en filas, en columnas.

Con un ejemplo sencillísimo, que involucre a una sola tabla, lo que querría es:

Dada la TABLA1, con los campos a, b, c y d, mostrar:

a,b,c,d1,d2

Con d1 y d2 valores de la columna d, resultados de consultas distintas sobre la tabla.

¿Alguien sabe cómo realizar esto?
  #2 (permalink)  
Antiguo 11/08/2008, 08:58
 
Fecha de Ingreso: agosto-2008
Mensajes: 1
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Cómo poner nombres a consultas para el uso de joins

Aqui esta un ejemplo que podria ayudarte:

select p.appellido, p.nombre, t1.codigo_o_valor telefono, t2.codigo_o_valor celular, t3.codigo_o_valor email
from hhyde.persona p
join hhyde.telecom t1 on t1.persona_id = p.persona_id and t1.telecomtipo_id = 1
join hhyde.telecom t2 on t2.persona_id = p.persona_id and t2.telecomtipo_id = 2
join hhyde.telecom t3 on t3.persona_id = p.persona_id and t3.telecomtipo_id = 3
;

Aqui esta el codigo DDL para crear las tablas del ejemplo y de rellenar algunos datos:

create table hhyde.persona ( persona_id number not null
, appellido varchar2(20) not null
, nombre varchar2(20) not null
);
alter table hhyde.persona add constraint persona_pk primary key (persona_id);

create table hhyde.telecom_tipo ( telecomtipo_id number not null
, nombre varchar2(20) not null
, descripcion varchar2(4000)
);
alter table hhyde.telecom_tipo add constraint tlcmtipo_pk primary key (telecomtipo_id);
alter table hhyde.telecom_tipo add constraint tlcmtipo_uk unique (nombre);

create table hhyde.telecom ( telecom_id number not null
, telecomtipo_id number not null
, persona_id number not null
, codigo_o_valor varchar2 (1000) not null
);
alter table hhyde.telecom add constraint telecom_pk primary key (telecom_id);
alter table hhyde.telecom add constraint telecom_uk unique (persona_id, telecomtipo_id);
alter table hhyde.telecom add constraint telecom_tlcmtipo_fk foreign key (telecomtipo_id) references telecom_tipo (telecomtipo_id);

alter table hhyde.telecom add constraint telecom_persona_fk foreign key (persona_id) references persona (persona_id);


insert into hhyde.telecom_tipo (telecomtipo_id, nombre, descripcion) values (1, 'Telefono', 'Telefono de casa');
insert into hhyde.telecom_tipo (telecomtipo_id, nombre, descripcion) values (2, 'Celular', 'Telefono celular');
insert into hhyde.telecom_tipo (telecomtipo_id, nombre, descripcion) values (3, 'EMail', 'Correo Electronico');

insert into hhyde.persona (persona_id, appellido, nombre) values (1, 'De Soto', 'Jesus');
insert into hhyde.persona (persona_id, appellido, nombre) values (2, 'Calderon', 'Felipe');
insert into hhyde.persona (persona_id, appellido, nombre) values (3, 'Uribe', 'Alvaro');

insert into hhyde.telecom (telecom_id, telecomtipo_id, persona_id, codigo_o_valor) values (1, 1, 1, '22-33-44-55' );
insert into hhyde.telecom (telecom_id, telecomtipo_id, persona_id, codigo_o_valor) values (2, 2, 1, '88-54-22-89' );
insert into hhyde.telecom (telecom_id, telecomtipo_id, persona_id, codigo_o_valor) values (3, 3, 1, '[email protected]' );
insert into hhyde.telecom (telecom_id, telecomtipo_id, persona_id, codigo_o_valor) values (4, 1, 2, '754-765-47-54' );
insert into hhyde.telecom (telecom_id, telecomtipo_id, persona_id, codigo_o_valor) values (5, 2, 2, '4467-2455-3' );
insert into hhyde.telecom (telecom_id, telecomtipo_id, persona_id, codigo_o_valor) values (6, 3, 2, '[email protected]' );
insert into hhyde.telecom (telecom_id, telecomtipo_id, persona_id, codigo_o_valor) values (7, 1, 3, '87473-58-592' );
insert into hhyde.telecom (telecom_id, telecomtipo_id, persona_id, codigo_o_valor) values (8, 2, 3, '5521-27-726-23' );
insert into hhyde.telecom (telecom_id, telecomtipo_id, persona_id, codigo_o_valor) values (9, 3, 3, '[email protected]' );
commit;

A tus ordenes,

Yanqui60
  #3 (permalink)  
Antiguo 12/08/2008, 03:20
 
Fecha de Ingreso: abril-2007
Mensajes: 160
Antigüedad: 17 años, 7 meses
Puntos: 1
Respuesta: Cómo poner nombres a consultas para el uso de joins

¡Gracias! Ya lo había hecho de otro modo, me es muy útil conocer ese modo "normalizado" de hacerlo (además, me ha servido para comprobar que lo que hice estaba bien).

El modo en que lo había hecho es:

select t1.campo_tabla, Prueba.campo, campo_tabla from (Prueba join tabla on tabla.a=Prueba.c ... <condiciones>)
join (select campo_tabla from tabla where ...) t1 on Prueba.c=t1.a
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:45.