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

No se puede repetir el nombre de la tabla 'directorio' en la cláusula FROM.

Estas en el tema de No se puede repetir el nombre de la tabla 'directorio' en la cláusula FROM. en el foro de Bases de Datos General en Foros del Web. hola a todos siento ser tan pesado, pero vuelvo a tener un problema que me supera. necesito sacar 2 registros de una misma tabla y ...
  #1 (permalink)  
Antiguo 12/02/2005, 03:25
 
Fecha de Ingreso: noviembre-2004
Ubicación: Sevilla
Mensajes: 139
Antigüedad: 20 años
Puntos: 0
No se puede repetir el nombre de la tabla 'directorio' en la cláusula FROM.

hola a todos
siento ser tan pesado, pero vuelvo a tener un problema que me supera.

necesito sacar 2 registros de una misma tabla y no se como hacerlo

Cita:
"SELECT usuarios.*, categorias.*, directorio.*, analisis.*,(select count(*) from Comentarios where Comentarios.comentarios_idcomentario=analisis.anal isis_id) as nComentarios FROM usuarios INNER JOIN (categorias inner join (directorio inner join (directorio inner join analisis on directorio.directorio_id = analisis.analisis_sello) on directorio.directorio_id = analisis.analisis_banda) on categorias.categorias_id = analisis.analisis_categoria) ON analisis.analisis_autor = usuarios.usuarios_id where categorias.categorias_analisis = true and analisis.analisis_publicado = true and directorio.directorio_bandas = true order by analisis.analisis_fecha desc"
No se puede repetir el nombre de la tabla 'directorio' en la cláusula FROM.

en la tabla DIRECTORIOS guardo los datos de "sellos" y "bandas" que estan relacionado con los camps "sello" y "banda" de la tabla ANALISIS, pero solo consigo sacar uno de ellos.

alguien puede ayudarme?

muchas gracias a todos
un saludo
__________________
Punkis De Mierda

Foro punk rock
  #2 (permalink)  
Antiguo 12/02/2005, 05:32
 
Fecha de Ingreso: febrero-2005
Mensajes: 396
Antigüedad: 19 años, 9 meses
Puntos: 1
Usualmente se puede hacer definiendo alias:

SELECT * FROM tabla t1, tabla t2 WHERE t1.loQueSea = t2.veteTuASaber;

Asi puedes poner el mismo nombre de tabla pero crear uniones mediante t1 y t2.

Un saludo

Zerjillo
  #3 (permalink)  
Antiguo 12/02/2005, 09:21
 
Fecha de Ingreso: noviembre-2004
Ubicación: Sevilla
Mensajes: 139
Antigüedad: 20 años
Puntos: 0
no se lo que me quieres decir :S













"SELECT usuarios.* t1, categorias.* t2, directorio.* t3, analisis.* t4,(select count(*) from Comentarios where Comentarios.comentarios_idcomentario=analisis.anal isis_id) as nComentarios FROM usuarios INNER JOIN (categorias inner join (directorio inner join (directorio inner join analisis on directorio.directorio_id = analisis.analisis_sello) on directorio.directorio_id = analisis.analisis_banda) on categorias.categorias_id = analisis.analisis_categoria) ON analisis.analisis_autor = usuarios.usuarios_id where categorias.categorias_analisis = true and analisis.analisis_publicado = true and directorio.directorio_bandas = true order by analisis.analisis_fecha desc"

asi¿? xDD estoy perdidisimo

gracias por responder




se me ha olvidado decir que trabajo con asp y access
__________________
Punkis De Mierda

Foro punk rock
  #4 (permalink)  
Antiguo 12/02/2005, 10:12
 
Fecha de Ingreso: febrero-2005
Mensajes: 396
Antigüedad: 19 años, 9 meses
Puntos: 1
Como comprenderas no puedo entender a pelo tu sentencia sql sin saber como está construida tu base de datos, así que o muestras un ejemplo simplificado (quitando los campos que no ofrecen problema) o chungo.

Me detengo sin embargo a ponerte un ejemplo más detallado de lo que queria decirte antes:

Supongamos que tenermos una tabla de "comentarios" (por ejemplo de un foro).

La tabla (que se llama "comentarios"), entre otros campos tiene:

id -> identificador
mensaje -> el mensaje
padre -> el identificador del comentario padre (porque puede ser una respuesta a un comentario).

Imagina por tanto que quiero obtener los mensajes de un determinado mensaje (el que tiene un id = 3) y el de todos sus hijos. Pues puedo hacer la siguiente sentencia:

SELECT t1.mensaje, t2.mensaje FROM comentarios t1, comentarios t2 WHERE t2.padre = t1.id AND t1.id = 3;

Asi pues, en la parte FROM puedo repetir una misma tabla, solo que creo un "alias" de la tabla en cada caso (las "renombro" temporalmente para esa sentencia como t1 y t2, como si fueran dos tablas distintas) y ya puedo manejarlas sin problemas.

Espero que te ayude.

Un saludo

Zerjillo
  #5 (permalink)  
Antiguo 14/02/2005, 03:48
 
Fecha de Ingreso: noviembre-2004
Ubicación: Sevilla
Mensajes: 139
Antigüedad: 20 años
Puntos: 0
no he conseguido que funcione lo que me dices... soy un negao :(

voy a intentar explicarlo mejor.

tengo una tabla ANALISIS con campos:

autor: aqui va la id del usuario en la tabla USUARIOS
categoria: la id de la categoria de la tabla CATEGORIAS
banda: la id de la banda de la tabla DIRECTORIO
y otra tabla COMENTARIOS, q aqui la uso para contar los comentarios pbublicados para este analisis

hasta aqui tengo este codigo que funciona correctamente

Cita:
strsql = "SELECT usuarios.*, categorias.*, directorio.*, analisis.*,(select count(*) from Comentarios where Comentarios.comentarios_idcomentario=analisis.anal isis_id) as nComentarios FROM usuarios INNER JOIN (categorias inner join analisis on directorio.directorio_id = analisis.analisis_banda) on categorias.categorias_id = analisis.analisis_categoria) ON analisis.analisis_autor = usuarios.usuarios_id where categorias.categorias_analisis = true and analisis.analisis_publicado = true and directorio.directorio_bandas = true order by analisis.analisis_fecha desc"
el problema viene ahora, cuando tengo que abrir la misma tabla para un REGISTRO DIFERENTE

el campo de la tabla ANALISIS es sello: la id del sello de la tabla DIRECTORIO

(guardo las bandas y los sellos en la misma tabla y los diferencio con una casilla si/no llamada "bandas": no son campos distintos en un mismo registro, sino registros diferentes; con ids distintas)


espero haberme explicado bien

gracias por vuestro tiempo

un saludo
__________________
Punkis De Mierda

Foro punk rock
  #6 (permalink)  
Antiguo 14/02/2005, 04:11
 
Fecha de Ingreso: febrero-2005
Mensajes: 396
Antigüedad: 19 años, 9 meses
Puntos: 1
bueno, la verdad es que el tema no es sencillo. Lanzo una pregunta al aire:

¿por que usas una sentencia SQL tan complicada? ¿no podrias, por ejemplo, obtener la cantidad total de comentarios en una sentencia aparte, para no complicar el asunto tanto? A veces intentar hacerlo todo "de golpe" puede ser muy complicado, y lo que espeor, si nos despistamos, puede ser muy ineficiente.

No estoy seguro, pero no te valdria algo asi como:

Código:
SELECT usuarios.*, categorias.*, d1.*, d2.*, analisis.* 
FROM usuarios, categorias, directorio d1, directorio d2, analisis 
WHERE 
  d1.directorio_id = analisis.analisis_banda 
AND 
  d2.directorio_id = analisis.analisis_sello 
AND 
  categorias.categorias_id = analisis.analisis_categoria
AND 
  analisis.analisis_autor = usuarios.usuarios_id
AND 
  categorias.categorias_analisis = true 
AND 
  analisis.analisis_publicado= true 
AND 
  directorio.directorio_bandas = true 
ORDER BY analisis.analisis_fecha DESC;

Como erás he quitado de la sentencia la obtencion del numero decomentarios para que no "enfollone" el asunto. Si te das cuenta la tabla directorio está repetida en el FROM, pero con un alias disitnto cada uno, y en la clausula WHERE tienes las condiciones de unión distintas para el SELLO y la BANDA:

Código:
  d1.directorio_id = analisis.analisis_banda 
AND
  d2.directorio_id = analisis.analisis_sello
¿Van por aqui los tiros?

Un saludo

Zerjillo
  #7 (permalink)  
Antiguo 14/02/2005, 08:23
 
Fecha de Ingreso: noviembre-2004
Ubicación: Sevilla
Mensajes: 139
Antigüedad: 20 años
Puntos: 0
va perfecto :)
pero necesito que me resuelvas la ultima duda.

como diferencio ahora los datos. rsanalisis("d1.directorio_nombre") y rsanalisis("d2.directorio_nombre") ? xD

yo antes todo esto de las tablas relacionadas lo hacia de otra forma. primero abria la tabla principal, y dentro de ella iba abriendo y cerrando las tablas relacionadas; pero en ete mismo foro me aconsejaron que lo hiciera de esta forma, que era mucho mejor para los casos en los que hay que mostrar muchos registros, como es mi caso, que tengo que mostrar 50.

muchisimas gracias por tu ayuda y x tu timepo :)

un saludo
__________________
Punkis De Mierda

Foro punk rock
  #8 (permalink)  
Antiguo 14/02/2005, 09:59
 
Fecha de Ingreso: febrero-2005
Mensajes: 396
Antigüedad: 19 años, 9 meses
Puntos: 1
Efectivamente, para esos campos de la tabla puedes utilizar el alias como tu dices:

t1.campo o t2.campo

De nada hombre, pa eso estamos

Un saludo

Zerjillo
  #9 (permalink)  
Antiguo 18/02/2005, 06:38
 
Fecha de Ingreso: noviembre-2004
Ubicación: Sevilla
Mensajes: 139
Antigüedad: 20 años
Puntos: 0
hola zerjillo siento volver al tema despues de dias, pero sq no he podido conectarme, veras no he solucionado del todo el problema, ya que no consigo diferenciar los campos.

si pongo rsanalisis("d1.directorio_nombre") me da el siguiente error

No se encontró el elemento en la colección que corresponde con el nombre o el ordinal pedido.

y si lo pongo sin el alias, es decir, rsanalisis("directorio_nombre"), me muestra los datos correspondientes al d2, pero soy incapaz de sacar los del d1

una ultima ayuda por favor :D

un saludo
__________________
Punkis De Mierda

Foro punk rock
  #10 (permalink)  
Antiguo 18/02/2005, 07:04
 
Fecha de Ingreso: agosto-2002
Mensajes: 230
Antigüedad: 22 años, 3 meses
Puntos: 1
La idea sería que en el select le dieras un nombre al campo para distinguirlo algo así:

Código:
SELECT d1.directorio_nombre as "DIRECTORIO1", d2.directorio_nombre as "DIRECTORIO2" ....
y así después accederías a los campos de esta manera

Código:
rsanalisis("DIRECTORIO1") y rsanalisis("DIRECTORIO2")
el problema es que no podrías usar el * para seleccionar todos los elementos de la tabla, sino que tendrías que ir uno por uno

Espero que te ayude
  #11 (permalink)  
Antiguo 21/02/2005, 05:17
 
Fecha de Ingreso: noviembre-2004
Ubicación: Sevilla
Mensajes: 139
Antigüedad: 20 años
Puntos: 0
si,me ha sido muy util, ya consigo mostrar los 2 datos :D

el d1 con rsanalisis("DIRECTORIO1") y el d2 con rsanalisis("directorio_nombre"),

el codigo final, por si a alguien le sirve es:

strsql = "SELECT usuarios.*, categorias.*, d1.directorio_nombre as directorio1, d2.*, analisis.*,(select count(*) from Comentarios where Comentarios.comentarios_idcomentario=analisis.anal isis_id) as nComentarios FROM usuarios INNER JOIN (categorias inner join (directorio d1 inner join (directorio d2 inner join analisis on d2.directorio_id = analisis.analisis_banda) on d1.directorio_id = analisis.analisis_sello) on categorias.categorias_id = analisis.analisis_categoria) ON analisis.analisis_autor = usuarios.usuarios_id where categorias.categorias_analisis = true and analisis.analisis_publicado = true and d2.directorio_bandas = true and d1.directorio_sellos = true order by analisis.analisis_album asc"

que tocho xD

muchas gracias a los 2 :)

un saludo
__________________
Punkis De Mierda

Foro punk rock
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:30.