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

secuencia select anidadas en postgresql¿

Estas en el tema de secuencia select anidadas en postgresql¿ en el foro de PostgreSQL en Foros del Web. Buenas, estoy trabajando con postgresql y necesito hacer una consulta sql un poco complicada y nose como hacer. Tengo dos tablas: reg_personal (id, nombre, dni, ...
  #1 (permalink)  
Antiguo 08/03/2010, 09:48
cce
 
Fecha de Ingreso: junio-2009
Mensajes: 92
Antigüedad: 14 años, 10 meses
Puntos: 0
secuencia select anidadas en postgresql¿

Buenas, estoy trabajando con postgresql y necesito hacer una consulta sql un poco complicada y nose como hacer.
Tengo dos tablas: reg_personal (id, nombre, dni, nacionalidad ) y otra tabla reg_fechas (id, fecha)

Quisiera hacer una secuencia sql para postgresql que me devuelva todos los registros de la tabla reg_personal que coincidad con los registro de la tabla reg_fechas, es decir que los id de ambas tablas coicidan pero que a su vez, me busque todos los registro en funcion de un rango de fechas.

Por separado es algo asi:

para buscar por rangos de fechas:
select * from reg_fechas where cast(fecha as date) between '2010-01-01' and '2010-04-01';

De esta secuencia yo sacaria todos los id segun un rango de fechas.

Como hago para buscar todos los registros de la tabla reg_personal cuyo id coicida con los id encontrados anterior, pero de una sola vez.

Por ejemplo esta consulta solo me devuelve cuatro veces el ultimo registro que encuentra en reg_fechas:

SELECT * FROM reg_fechas LEFT OUTER JOIN reg_personal ON (id = (select id from reg_fechas where cast(fecha as date) between '2010-01-01' and '2010-04-01'));

Como hago para que me devuelva todos los registros coicidentes?...tengo qe hacer si o si dos consutlas o se puede hacer en una sola secuencia sql?

Cualquier ayuda se los agradeceria.

Muchas Gracias y Saludos.-
  #2 (permalink)  
Antiguo 08/03/2010, 10:43
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: secuencia select anidadas en postgresql¿

Si te entendí bien, prueba esto

Código SQL:
Ver original
  1. SELECT
  2. rp.id,
  3. rp.nombre,
  4. rp.dni,
  5. rp.nacionalidad,
  6. rf.fecha
  7. FROM
  8. reg_personal AS rp
  9. INNER JOIN
  10. reg_fechas AS rf
  11. ON
  12. rp.id = rf.id
  13. WHERE
  14. rf.fecha::DATE
  15. BETWEEN '2010-01-01'
  16. AND '2010-04-01'

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 09/03/2010, 06:20
cce
 
Fecha de Ingreso: junio-2009
Mensajes: 92
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: secuencia select anidadas en postgresql¿

Hola huesos 52, la secuencia que me pasaste me da como resultado solo un valor, el ultimo que encuentra.

Por ejemplo:
El reg_fechas tiene : fch_1: id
2010-01-01 7
2010-01-05 10
2010-02-16 8
2010-02-25 3

Cuando ejecuto la secuencia solo me da como resultado, los datos del id=3 y los otros no. Es decir, los datos correspondientes al usuario cuyo id=3: dni, nombre, etc...

Yo necesito que me de una lista con todos los datos de cada id= 7, 10, 8, 3.

Nose si me logro hacer entender:

Por ejemplo, necesitaria que me de un resultado asi:
id=7 dni=131351165 nombre=pepe
id=10 dni=6486466 nombre=juancho
id=8 dni=1648468 nombre=lulu
id=3 dni=154166 nombre=jasinta

Pero esa secuencia me da solo el ultimo resultado, es decir: id=3 dni=154166 nombre=jasinta

Bueno, Muchsimas gracias por responderme, cualquier otra ayudita te lo agradeceria un monton.

Saludos.-
  #4 (permalink)  
Antiguo 09/03/2010, 06:36
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: secuencia select anidadas en postgresql¿

cce postea la creación de las tablas
(create table fechas(id....)etc y algunos inserts de ejemplo (insert into tabla values(1,'algo'...)
para ayudarte a tener la salida que esperas con base en los datos que tienes.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 09/03/2010, 08:19
cce
 
Fecha de Ingreso: junio-2009
Mensajes: 92
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: secuencia select anidadas en postgresql¿

huesos52, te paso la descripcion de las tablas que aparece en postgresql:, si necesitas si o si los CREATE, avisame y te los paso.

La tabla: reg_fechas:

Tabla «public.reg_fechas»

Columna | Tipo | Modificadores
---------+----------------------------- ..........................+------------------------
id | smallint | not null
fchl | timestamp without time zone | not null default now()
Índices:

«reg_fechas_pkey» PRIMARY KEY, btree (id, fchl)


Tabla «public.reg_personal»

Columna | Tipo ....... | Modificadores
--......-------+-----------------------------............ +---------------
id | smallint | not null
fchl | timestamp without time zone | not null
nombre | character varying(30) | not null
dni | character varying(15) | not null

Índices:
«reg_personal_pkey» PRIMARY KEY, btree (id, fchl)

Para reg_fechas:

INSERT (id) INTO reg_fechas VALUES(7);

Para reg_personal: El campo id es autoincremental, a medida que se van registrando los usuarios se les asigna un id. Y el campo fchl, no tiene nada que ver con el fchl del reg_fechas, es solo para saber cuando se registro.

INSERT (nombre,dni) INTO reg_personal VALUES('pepe' , 22587149 );

Espero haber dado suficientes datos, cualquier cosa me decis y sigo mandando alguna informacion que necesites.

Saludos y muchisimas gracias.-
  #6 (permalink)  
Antiguo 09/03/2010, 08:29
cce
 
Fecha de Ingreso: junio-2009
Mensajes: 92
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: secuencia select anidadas en postgresql¿

No salieron muy bien las tablas:


CREATE TABLE reg_personal
( ID serial not null,
FCHL timestamp,
NOMBRE varchar(30) not null,
DNI varchar(15) not null
Primary key (ID, FCHL)) without oids;


CREATE TABLE reg_fechas
( ID smallint,
FCHL TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
primary key (ID, FCHL)) without oids;

espero ayude.

Saludos.-
  #7 (permalink)  
Antiguo 09/03/2010, 08:49
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: secuencia select anidadas en postgresql¿

No entiendo por que te sale son uno.

Mira esto

Código SQL:
Ver original
  1. pruebas=> SELECT *FROM reg_personal;
  2.  id |  nombre   |   dni
  3. ----+-----------+---------
  4.   7 | 131351165 | pepe
  5.  10 | 6486466   | juancho
  6.   8 | 1648468   | lulu
  7.   3 | 154166    | jasinta
  8. (4 filas)
  9.  
  10. pruebas=> SELECT *FROM reg_fechas;
  11.  id |          fchl
  12. ----+-------------------------
  13.   7 | 2010-03-09 09:39:08.625
  14.  10 | 2010-03-09 09:41:27.64
  15.   8 | 2010-03-09 09:41:34.281
  16.   3 | 2010-03-09 09:41:37.078
  17. (4 filas)
  18.  
  19. pruebas=> SELECT
  20. pruebas-> rp.id,
  21. pruebas-> rp.nombre,
  22. pruebas-> rp.dni,
  23. pruebas-> rf.fchl
  24. pruebas-> FROM
  25. pruebas-> reg_personal AS rp
  26. pruebas-> INNER JOIN
  27. pruebas-> reg_fechas AS rf
  28. pruebas-> ON
  29. pruebas-> rp.id = rf.id
  30. pruebas-> WHERE
  31. pruebas-> rf.fchl::DATE
  32. pruebas-> BETWEEN '2010-01-01'
  33. pruebas-> AND '2010-04-01';
  34.  id |  nombre   |   dni   |          fchl
  35. ----+-----------+---------+-------------------------
  36.   3 | 154166    | jasinta | 2010-03-09 09:41:37.078
  37.   7 | 131351165 | pepe    | 2010-03-09 09:39:08.625
  38.   8 | 1648468   | lulu    | 2010-03-09 09:41:34.281
  39.  10 | 6486466   | juancho | 2010-03-09 09:41:27.64
  40. (4 filas)

Con la consulta que te dí en un principio me sale bien.

Saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 09/03/2010, 09:02
cce
 
Fecha de Ingreso: junio-2009
Mensajes: 92
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: secuencia select anidadas en postgresql¿

Si, ahora me anda..pero no entiendo porque no me anda con otras tablas parecidas.

Bueno voy a seguir intentando..cualquier cosa te chiflo...muchas gracias.
  #9 (permalink)  
Antiguo 09/03/2010, 09:15
cce
 
Fecha de Ingreso: junio-2009
Mensajes: 92
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: secuencia select anidadas en postgresql¿

Te muestro otras dos tablas similares con las que no me sale, solo me da el ultimo elemento:

Tabla «public.ra»
Columna | Tipo | Modificadores
---------+-----------------------------+---------------
id | smallint | not null
fchl | timestamp without time zone | not null
dmn | character varying(12) |
nchs | character varying(25) |
nmtr | character varying(25) |
mrc | character varying(20) |
mdl | character varying(20) |
clr | character varying(15) |
nf12 | character varying(20) | not null
nyat | character varying(30) | not null
dnit | character varying(15) | not null
nccd | character varying(30) | not null
fch | character varying(10) |
idp | smallint | not null
idpv | smallint | not null
bsvs | text |
tp | character varying(1) |
Índices:
«ra_pkey» PRIMARY KEY, btree (id, idp, idpv, fchl)



Tabla «public.hcv»
Columna | Tipo | Modificadores
---------+-----------------------------+------------------------
id | smallint | not null
idm | integer |
tv | character varying(25) |
rcm | character varying(25) |
m | character varying(25) |
fchl | timestamp without time zone | not null default now()
Índices:
«hcv_pkey» PRIMARY KEY, btree (id, fchl)


select * from hcv;

id | idm | tv | rcm | m | fchl
----+--------+--------------+----------------+------------------+----------------------------
40 | | automovil | | | 2010-03-04 09:58:37.942077
40 | 401052 | motovehiculo | 23479872348923 | 23479872348923 | 2010-03-04 10:01:39.543915
40 | 404233 | automovil | 777 | 8798789798789789 | 2010-03-04 09:58:21.990037
40 | | automovil | 756765756 | | 2010-03-08 08:51:32.91414
(4 filas)


select * from ra;

id | fchl | dmn | nchs | nmtr | mrc | mdl | clr | nf12 | nyat | dnit | nccd | fch | idp | idpv | bsvs | tp
----+---------------------+-----------+--------------------+-----------------+----------+---------+-----------------+--------------------+--------+------------+---------------------+------------+-----+------+-----------------------------------------------------------------------------------+----
1 | 2010-01-11 11:39:00 | 0000 | 34545gsdfg344 | 2308923 | Ford | Ka | blanco-celeste | 3453453453454 | C | 26.150.146 | 308974894fh39283892 | 11/01/2010 | 1 | 1 | Posee faro trasero roto.--ademas no tiene rueda d auxilio.- |
40 | 2010-02-04 08:30:58 | XXXXQQQQ | 7r6u7rng6y876 | 5688ighjk | ghjkgdhj | ghfgh | bbbbb | 756765756 | ccc | 55645645 | hgfgh | 28/01/2010 | 1 | 1 | ninguna.-| M
1 | 2010-01-14 09:49:24 | 324sdgf | 3328923892389eh392 | 2309409dhf34902 | boing | 707b | blanco-celeste | 328934e38 | a | 2368945362 | 303023dhehd38239 | 08/01/2010 | 1 | 1 | ninguna.- | A
40 | 2010-02-10 09:35:54 | 345dfgdfg | 38r78dsvfu493 | 43r7dfbjh | skdbv | sv isdb | blanco | 9348 ty9rt49yr4934 | tttt | 3333245 | 3459834r594 | 10/02/2010 | 51 | 4 | weiegif | M
40 | 2010-03-04 09:58:26 | aaa777 | 789798hjg7868898 | 98679787bg7ty79 | pika | II | blanca y celest | 8798789798789789 | c.c.e. | 26.150.146 | 68666977798798 | 14/01/2010 | 1 | 1 | nfgfdg | V
(5 filas)

SELECT dmn, nf12 FROM ra INNER JOIN hcv AS hcv ON nf12 = rcm WHERE hcv.fchl::date BETWEEN '2010-02-01' AND '2010-05-31';

dmn | nf12
--------+-----------
XXXXQQQQ | 756765756
(1 fila)
  #10 (permalink)  
Antiguo 09/03/2010, 09:18
cce
 
Fecha de Ingreso: junio-2009
Mensajes: 92
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: secuencia select anidadas en postgresql¿

En este caso el ID del registro " ra " no es autoincremental ( SERIAL).
  #11 (permalink)  
Antiguo 09/03/2010, 09:43
cce
 
Fecha de Ingreso: junio-2009
Mensajes: 92
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: secuencia select anidadas en postgresql¿

Te lo paso mas prolijo:

Probe las dos secuencias y solo me devuelve el ultimo de la lista que encuentra. Me deberia devolver 4 filas y de esas 4 solo me devuelve la ultima.

Tengo dos tablas:

CREATE TABLE ra
( ID smallint not null,
FCHL TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
DMN varchar(12),
NYA varchar(30) not null,
DNI varchar(15) not null,
primary key (ID,FCHL)) without oids;

CREATE TABLE hcv
( ID smallint,
RCM varchar(25),
FCHL TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
primary key (ID, FCHL)) without oids;


Suponiendo que estos son los dos ultimos registros que se han almacenado, siendo que el campo " id " se repite muchas veces.

INSERT INTO ra (id,dmn,nya,dni) values (2,'6347','pepe','734957844');

INSERT INTO hcv (id,rcm) values(2,'6347');

De esta manera se van llenado las tablas: primero se llena la tabla " ra ", luego la tabla " hcv ".

SELECT nya, dni FROM ra as a INNER JOIN hcv AS b ON a.dmn = b.rcm WHERE b.fchl::date BETWEEN '2010-01-01' AND '2010-05-31';

Lo mismo me da si escribo esta secuencia:

select nya,dni from ra as a left outer join hcv as b
on a.dmn = b.rcm
where b.fchl between '2010-01-01' and '2010-05-01';

Me devuelve solo un registro, el ultimo:

nya dni
-------- ----------
pepe 734957844
(1 fila)



Por que me devuelve solo uno cuando me deberia devolver todos?
  #12 (permalink)  
Antiguo 09/03/2010, 12:21
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: secuencia select anidadas en postgresql¿

No tengo como decirte ya que solo me has dado un solo registro de ejemplo para las pruebas.

Por eso, en las 2 consultas da lo mismo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #13 (permalink)  
Antiguo 15/03/2010, 04:58
cce
 
Fecha de Ingreso: junio-2009
Mensajes: 92
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: secuencia select anidadas en postgresql¿

ya lo pude hacer andar. El script que me pasaste anda bien, el error era mio. Muchisimas gracias por tu tiempo y respuesta. Saludos.-

Etiquetas: anidadas, secuencia, select
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 09:22.