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

Consultas complejas

Estas en el tema de Consultas complejas en el foro de PostgreSQL en Foros del Web. SELECT forum_id, forum_project, forum_description, forum_owner, forum_name,forum_moderated, forum_create_date, forum_last_date,sum(case c.message_parent=-1 when true then 1 when false then 0 ELSE null END) as forum_topics, sum(case c.message_parent >0 ...
  #1 (permalink)  
Antiguo 02/09/2009, 09:06
 
Fecha de Ingreso: septiembre-2009
Mensajes: 3
Antigüedad: 14 años, 7 meses
Puntos: 0
Pregunta Consultas complejas

SELECT forum_id, forum_project, forum_description, forum_owner, forum_name,forum_moderated, forum_create_date,
forum_last_date,sum(case c.message_parent=-1 when true then 1 when false then 0 ELSE null END) as forum_topics,
sum(case c.message_parent >0 when true then 1 when false then 0 ELSE null END) as forum_replies,
user_username, project_name, project_color_identifier, (contact_first_name ||','||contact_last_name) AS owner_name,
SUBSTRING(l.message_body from 1 for 30) AS message_body,LENGTH(l.message_body) AS message_length, watch_user, l.message_parent,
l.message_id,count(distinct v.visit_message) as visit_count, count(distinct c.message_id) as message_count
FROM "projects" AS pr,"users" AS u,"forums" AS forums
LEFT JOIN "forum_messages" AS l ON l.message_id = forum_last_id
LEFT JOIN "forum_messages" AS c ON c.message_forum = forum_id
LEFT JOIN "forum_watch" AS w ON watch_user = 1 AND watch_forum = forum_id
LEFT JOIN "forum_visits" AS v ON visit_user = 1 AND visit_forum = forum_id and visit_message = c.message_id
LEFT JOIN "contacts" AS cts ON contact_id = u.user_contact
LEFT JOIN "companies" AS co ON co.company_id = pr.project_company
LEFT JOIN "project_departments" AS project_departments ON pr.project_id = project_departments.project_id
LEFT JOIN "departments" AS dep ON dep.dept_id=project_departments.department_id
WHERE user_id = forum_owner AND pr.project_id = forum_project AND project_active = 1
GROUP BY forum_id,forum_project,forum_description,forum_own er, forum_name,forum_moderated, forum_create_date, user_username, project_name, project_color_identifier,
forum_last_date
ORDER BY forum_name asc

Al correr me da este error por favor alguien que me de luces para solucionarlo



ERROR: invalid reference to FROM-clause entry for table "u"
HINT: There is an entry for table "u", but it cannot be referenced from this part of the query.
  #2 (permalink)  
Antiguo 02/09/2009, 09:24
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: Consultas complejas

Cita:
FROM "projects" AS pr,"users" AS u,"forums" AS forums
LEFT JOIN "forum_messages" AS l ON l.message_id = forum_last_id
LEFT JOIN "forum_messages" AS c ON c.message_forum = forum_id
LEFT JOIN "forum_watch" AS w ON watch_user = 1 AND watch_forum = forum_id
LEFT JOIN "forum_visits" AS v ON visit_user = 1 AND visit_forum = forum_id and visit_message = c.message_id
LEFT JOIN "contacts" AS cts ON contact_id = u.user_contact
LEFT JOIN "companies" AS co ON co.company_id = pr.project_company
LEFT JOIN "project_departments" AS project_departments ON pr.project_id = project_departments.project_id
LEFT JOIN "departments" AS dep ON dep.dept_id=project_departments.department_id
Primero separas las tablas con coma y luego realizas anidaciones con left join. No entiendo que tratas de hacer con esto.

fijate que el error te lo muestra en la tabla u que corresponde a users que va despues del from a la tabla projects.

Por que no haces todas las tablas con sentencias join?

Esto es un error de sintaxis que postgresql no logra resolver.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 02/09/2009, 10:49
 
Fecha de Ingreso: septiembre-2009
Mensajes: 3
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Consultas complejas

Gracias huesos.
No soy muy enterado en Postgres es mi primer round y estoy a punto ko tecnico.
Estoy administrado foros por proyectos.

De mover líneas arriba abajo a la derecha a la izauierda, llegue como conclusión que postgres solo permite realizar joins con una sola tabla del from.

voy a probar tú sugerencia de tener 1 tabla en from y todo lo demás con sentencias join

Talvez si conoces de informacion sobre el asunto te agradecería en el manual es muy escueta. La documentación debería tratar sobre consultas complejas
  #4 (permalink)  
Antiguo 03/09/2009, 02:40
Avatar de pgsqlesorg  
Fecha de Ingreso: septiembre-2009
Ubicación: Noruega
Mensajes: 10
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Consultas complejas

Separar las tablas con comas en el FROM del comando significa en PostgreSQL lo mismo que si usaramos un INNER JOIN ON (TRUE) o un CROSS JOIN entre estas tablas. Todos estos tipos de JOIN son en realidad el producto cartesiano de las tablas en cuestion.

El problema y el error que te da es por usar unos 'joins' definidos con comas y otros con la sentencia JOIN en la misma consulta.

Segun el estandar SQL la palabra JOIN tiene mayor prioridad que la coma cuando se definen joins y se evalua internamente la consulta. Por ello, el alias 'u' que defines con '"users" AS u' no esta disponible en el 'ON contact_id = u.user_contact'.

No definas joins de dos maneras diferentes en la misma consulta. Define '"projects" AS pr,"users" AS u,"forums" AS forums' con sentencias JOIN.

Otra cosa que deberias de acostumbrarte a usar es calificar los nombre de las columnas que utilices (nombre_tabla.nombre_columna o alias_tabla.nombre_columna) cuando haces un JOIN entre tablas. Con esto te evitaras problemas si las tablas involucradas tienen alguna columna con el mismo nombre

--
Rafael Martinez
PostgreSQL-es.org

Última edición por pgsqlesorg; 08/09/2009 a las 06:55
  #5 (permalink)  
Antiguo 03/09/2009, 14:16
 
Fecha de Ingreso: septiembre-2009
Mensajes: 3
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Consultas complejas

Muy agradecidos a ambos, lo último ha sido una gran enseñanza
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 12:51.