PostgreSQL - Query

   
Vista:

Query

Publicado por zendi (98 intervenciones) el 26/02/2015 03:04:26
Buenas noches estoy tratando de crear un query para seleccionar un registro emparentando dos tablas, las tablas son paciente y consulta ls cuales estan relacionadas con el campo nrohistoria pero no esta funcionando, la idea es que se cree un registro, y no muchos

Nota: la relacion es uno a muchos.
En la tabla paciente aparece una sola vez; pero en la tabla consulta aparecen muchos; es decir de uno a muchos

el problema es que esta trayendo muchos registros innecesariamente, solo debe traer uno, si alguien pudiera ayudarme.

y me arroja el query de esta forma:
query

las estructuras son estas; para paciente es esta:

paciente

y la tabla consulta es muy grande:
CREATE TABLE consulta
(
id_consulta serial NOT NULL,
nrohistoria numeric NOT NULL,
fecha date NOT NULL,
id_paciente serial NOT NULL,
peso numeric(5,2),
talla numeric(5,2),
circunfcefalica numeric(5,2),
circunfbrazo numeric(5,2),
cod_hcm integer,
observacion text,
meses numeric,
anios numeric,
hepatitisa numeric,
hepatitisb numeric,
polio numeric,
fiebreamarilla numeric,
difteriatetanos numeric,
varicela numeric,
meningitis numeric,
haemophilusinfluenza numeric,
sarampion numeric,
rubeola numeric,
parotiditis numeric,
vph numeric,
rotavirus numeric,
tuberculosis numeric,
alergiap numeric,
amigdalp numeric,
anemiap numeric,
apendicitisp numeric,
asmap numeric,
bronquip numeric,
denguep numeric,
dabdominalp numeric,
chinkungunyap numeric,
colerap numeric,
gripep numeric,
hepap numeric,
hepabp numeric,
meninp numeric,
otitisp numeric,
parotidap numeric,
sarampp numeric,
vphp numeric,
CONSTRAINT consulta_pkey PRIMARY KEY (id_consulta),
CONSTRAINT consulta_cod_hcm_fkey FOREIGN KEY (cod_hcm)
REFERENCES hcm (codigo) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT consulta_nrohistoria_fkey FOREIGN KEY (nrohistoria)
REFERENCES paciente (nrohistoria) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE RESTRICT
)
WITHOUT OIDS;
ALTER TABLE consulta OWNER TO postgres;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Query

Publicado por Ramiro (4 intervenciones) el 26/02/2015 14:24:31
El problema esta claro y es evidente, no estas haciendo el join entre las tablas paciente y consulta, por lo cual te esta mostrando el producto cartesiano entre ambas. es decir, te falta un" WHERE PACIENTE.NROHISTORIA = CONSULTA.NROHISTORIA".
Además noto una falla de diseño grave en las tablas, es decir CONSULTA con PACIENTE debería estar relacionado por id_paciente que es la PK de esta ultima tabla, de otra manera no estas garantizando la integridad referencial
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Query

Publicado por zendi (98 intervenciones) el 26/02/2015 16:42:56
Hola Ramiro, Pero no es aceptable hacerlo con NROHISTORIA? Dichas tablas las relacioné con estos campos. Por favor explicame un poco mas al respecto.

acabo de colocar el WHERE que me dijiste asi:

SELECT paciente.nrohistoria,
nombres,
apellidos,
direccion,
telefono,
gsanguineo.descripcion,
sexo.descripcion,
consulta.meses,
anios
FROM paciente,
consulta,
gsanguineo,
sexo
WHERE public.paciente.nrohistoria = consulta.nrohistoria and paciente.cod_sanguineo = gsanguineo.codigo and paciente.cod_sexo=sexo.codigo
GROUP BY paciente.nrohistoria,
nombres,
apellidos,
direccion,
telefono,
gsanguineo.descripcion,
sexo.descripcion,
consulta.meses,
consulta.anios


y arroja esto:

query
la idea es en este es caso filtrar el nrohistoria nro 27

Gracias, Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Query

Publicado por Ramiro (4 intervenciones) el 27/02/2015 14:46:21
Bueno, vamos por partes:

1°- la consulta no te devuelve en rejistro n° 27 porque le has sacado esa condición del WHERE, es decir, a lo que ya tenías tenes que agregarle lo que te pase, pero sin sacarle nada, manteniendo la condición paciente.nrohistoria = 27.
2° tendrias que leer un poco de teoria de base de datos, ya que parece un tema tribial pero creeme que no lo es. Cuando digo que no puedes garantizar la integridad referencial me refiero a que si no relacionas las tablas usando sus claves primarias(las cuales garantizan que los registros sean unicos y no nulos) corres riesgo que alguien agregue o acualice por ejemplo un paciente con n° de historia nulo y despues pierdas o no puedas hacer la relación con la otra tabla, cosa que no ocurriría si la relación es a través de su clave primaria, eso sin mencionar que generarías un conflicto de ambiguedad al tener dos pacientes con nrohistoria nulo y el motor de base de datos no sabría con que consulta relacionarlo.
Por otra parte le estas impidiendo al motor de base de datos hacer el trabajo de chequeo de integridad referencial, ya que si eliminas un paciente se pierden todas las relaciones con sus consultas si que el motor pueda advertirlo.
3° No se entiende que es lo que estas tratando de consultar en los post que siguen, ni cuales son las soluciones o problemas que has encontrado.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Query

Publicado por zendi (98 intervenciones) el 26/02/2015 20:28:34
Hola que tal.
Bueno sigo trabajando sobre esto, tengo todavia la misma estructura, pero modifiqué la peticion en el SQL

ahora de esta manera (tengo dos registros en cada tabla):

query2

y la consulta es esta:

query
Reconozco que estoy fallando un poco en diseñar base de datos.
Señalenme donde hay algun error.
gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Query

Publicado por zendi (98 intervenciones) el 27/02/2015 01:08:32
Buenas noches. Escribí esta consulta

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
SELECT p.nrohistoria,
       p.nombres,
       p.id_paciente AS paciente,
       c.id_paciente,
       c.id_consulta,
       gsanguineo.descripcion AS "Grupo Sanguíneo",
       hcm.descripcion AS "Clínica",
       sexo.descripcion AS "Sexo",
       c.fecha,
       c.peso,
       c.talla,
       c.circunfcefalica,
       c.circunfbrazo,
       c.observacion,
       c.hepatitisa,
       c.hepatitisb,
       c.polio,
       c.fiebreamarilla,
       c.difteriatetanos,
       c.varicela,
       c.meningitis,
       c.haemophilusinfluenza,
       c.sarampion,
       c.rubeola,
       c.parotiditis,
       c.vph,
       c.rotavirus,
       c.tuberculosis
  FROM paciente p, consulta c, gsanguineo,hcm,sexo
 WHERE p.nrohistoria = 1 AND fecha = '2015-02-26'
   AND p.cod_sanguineo = gsanguineo.codigo
   AND c.cod_hcm = hcm.codigo
   AND p.cod_sexo = sexo.codigo
GROUP BY p.nrohistoria,
       p.nombres,
       c.id_paciente,
       p.id_paciente,
       gsanguineo.descripcion,
       hcm.descripcion,
       sexo.descripcion,
       c.id_consulta,
       c.fecha,
       c.peso,
       c.talla,
       c.circunfcefalica,
       c.circunfbrazo,
       c.observacion,
       c.observacion,
       c.id_consulta,
       c.hepatitisa,
       c.hepatitisb,
       c.polio,
       c.fiebreamarilla,
       c.difteriatetanos,
       c.varicela,
       c.meningitis,
       c.haemophilusinfluenza,
       c.sarampion,
       c.rubeola,
       c.parotiditis,
       c.vph,
       c.rotavirus,
       c.tuberculosis

y arroja este resultado:


query
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Query

Publicado por Ramiro (4 intervenciones) el 27/02/2015 15:01:27
Acá ya no entiendo nada, en especial cual es el resultado que esperas al agregar la clausula GROUP BY
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Query

Publicado por zendi (98 intervenciones) el 28/02/2015 01:53:05
hasta donde yo se; es para agrupar por los campos y que no se repitan como en este caso donde nrohistoria,nombres etc, aparecen varias veces, esto lo hice con un ejemplo de un sitio web, pero por favor explicame como debo tratar esto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Query

Publicado por luis (20 intervenciones) el 11/03/2015 16:16:19
el uso de l join pudes usar para a parear dos tablas o e incluso campos distinto de tablas distintas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar