Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-06-2005
Barzaugc Barzaugc is offline
Miembro
 
Registrado: jun 2005
Posts: 50
Poder: 19
Barzaugc Va por buen camino
Lightbulb pregunta SQL interesante

Hola de nuevo mundo delphi, tengo una buena pregunta para ustedes, en codigo SQL, que instruccion se utilizaria para saber si existe una tabla?, por ejemplo, tenemos una base de datos que tiene 3 tablas (tabla1,tabla2 y tabla3) si queremos buscar una tabla4, que instruccion se utilizaria?, si es que la hay, o de que otra manera se podría saber si existe o no.
Responder Con Cita
  #2  
Antiguo 21-06-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Podes lanzar un select contra el diccionario de datos.

En firebird, por ejemplo, podes averiguarlo así:

Código SQL [-]
Select count(*)
  from rdb$relations
 where rdb$relation_name = 'TABLA4';

Si devuelve 1, la tabla existe, si devuelve 0 la tabla no existe.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 21-06-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.285
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Para SQL Server sería algo así:

Código SQL [-]
   select * from sysobjects where Name = 'tabla4' and xtype='U'

Una optimización que sirve para todos los SGBD's es:
(1) Utilizar un TOP 1.
(2) Preguntar por un sólo campo en lugar de por todos (*)

Código SQL [-]
    select TOP 1 Name from sysobjects where Name = 'tabla4' andxtype='U'
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 21-06-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
En MySql sería:

Código SQL [-]
show tables like 'Tabla4'

Si te regresa un registro es que existe, si no te regresa ningún registro es que no existe.

En Paradox no creo que haya más esperanza que:

Código Delphi [-]
Table.TableName = 'Tabla4';

try
  Table.Open;
except
  ShowMessage('La tabla no existe');
end;

Como verás, cada SGDB funciona distinto por lo que siempre es bueno especificar con cuál estás trabajando.

// Saludos
Responder Con Cita
  #5  
Antiguo 21-06-2005
Barzaugc Barzaugc is offline
Miembro
 
Registrado: jun 2005
Posts: 50
Poder: 19
Barzaugc Va por buen camino
Gracias por interesarse en mi pregunta, pero falta una cosa mas, me hablan de SQL Server y Firebird, pero como seria eso mismo en una base de datos en Access? .
Responder Con Cita
  #6  
Antiguo 21-06-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.285
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Barzaugc
...pero falta una cosa mas, me hablan de SQL Server y Firebird, pero como seria eso mismo en una base de datos en Access? .
Realiza un Select de la tabla:

Código SQL [-]
    Select campo from tabla4

y captura el error similar a como te han explicado para Paradox.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 23-06-2005 a las 10:20:06.
Responder Con Cita
  #7  
Antiguo 23-06-2005
ramiretor ramiretor is offline
Miembro
 
Registrado: may 2003
Ubicación: México
Posts: 196
Poder: 21
ramiretor Va por buen camino
Hola a todos:
Para aquellos que les gusta el Oracle y para darle un valor agregado al hilo (jajaja), o bien, como breviario cultural va la consulta en Oracle:

Código SQL [-]

  select count(*) from all_tables
    where table_name = 'TABLA4'
      and owner = 'MIUSUARIO';

Saludos
__________________
Ernesto R.
Responder Con Cita
  #8  
Antiguo 23-06-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.285
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
...sigo diciendo que un Count(*) es muy costoso (sea la BD que sea...).
Si sólo se quiere saber si algo existe, ¿Porqué contarlos todos?
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #9  
Antiguo 23-06-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Neftali
...sigo diciendo que un Count(*) es muy costoso (sea la BD que sea...).
Si sólo se quiere saber si algo existe, ¿Porqué contarlos todos?
Es que no necesariamente cuentas todos. Por lo menos en MySql con tablas MyISAM, una instrucción como select count() está totalmente optimizada y realmente no cuenta los registros si no que tal información está en la cabecera del archivo en disco.

// Saludos
Responder Con Cita
  #10  
Antiguo 23-06-2005
ramiretor ramiretor is offline
Miembro
 
Registrado: may 2003
Ubicación: México
Posts: 196
Poder: 21
ramiretor Va por buen camino
Hola:
Sobre lo que dices Neftali de que no se debe contar los registros ¿cómo le hago para que la consulta me regrese solo un registro en el caso de que la tabla exista?. En Oracle se agrega:

Código SQL [-]
 select campo1 from tablax
   where rownum < 2;

Pero ¿ y en otros motores?. Ya que me queda claro que si la tabla no trae muchos registros recupera el campo rápidamente, de lo contrario yo siempre me he ido con el conteo de los registros.

Saludos
__________________
Ernesto R.
Responder Con Cita
  #11  
Antiguo 23-06-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

Cita:
Empezado por Neftali
...sigo diciendo que un Count(*) es muy costoso (sea la BD que sea...).
Si sólo se quiere saber si algo existe, ¿Porqué contarlos todos?

En el caso particular que estamos tratando, supongo que será tan costoso contar un solo campo como contar todos los campos del único registro probable que podemos obtener.

También es de esperar que los diseñadores de los motores, sabiendo el extendido uso que se hace de count(*) como método para contar implementen en el optimizador algún mecanismo para contar solo las cabeceras, por ejemplo en algún índice, tal como ya habia especulado roman. En todo caso, quien tenga tiempo de probarlo, que analice los planes de ejecución que proponen los principales motores y que nos cuente sus hallazgos.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #12  
Antiguo 23-06-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por jachguate
tal como ya habia especulado roman
¡Ah! ¡No señor! Yo no es-pe-cu-lo

Cita:
Empezado por manual de MySql
COUNT(*) on a single table without a WHERE is retrieved directly from the table information for MyISAM and HEAP tables. This is also done for any NOT NULL expression when used with only one table.


// Saludos
Responder Con Cita
  #13  
Antiguo 27-06-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.285
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Neftali
...sigo diciendo que un Count(*) es muy costoso (sea la BD que sea...).
Si sólo se quiere saber si algo existe, ¿Porqué contarlos todos?
Vamos a ver si me explico (las 2 partes):
Suponiendo que queremos "buscar si existe en una tabla TABLA si existe un registro cuyo campo TABLENAME es igual a tabla4"; Que es lo que inicialmente se quería...
(1) El * significa que cuentas todos los campos de la tabla. Porqué contarlos todos si sólo necesitas contar;En ese caso utiliza la PK. Ésta mejora considero que es "insignificante" y supongo que el SGBD debe optimizarla... (pero eso no es escusa para no hacerlo bien -el pensar que alguien va a venbir detrás a optimizar...-)

(2) El Count (ese sí me parece importante); Si queremos buscar un registro y hacemos un SELECT TOP 1...WHERE..., el SGBD buscará el primero y cuando lo encuentre parará de buscar (me imagino yo, ya que le hemos dicho que sólo busque uno...), en cambio si le decimos que haga un COUNT..WHERE deberá recorrer necesariamente TODA la tabla (no hay otra forma de contar cuantos hay). Ésta era mi apreciación. Ya se que en algunos casos se puede optimizar (por ejemplo si existe índice por el campo de WHERE), pero el coste en sí es mucho mayor y en tablas grandes se puede notar mucho.

Por tanto sigo manteniendo que hacer un Count para saber si algo existe es incorrecto.
ACLARA1: Que puede ser que si se cumplen unas condiciones y seguramente si el SGBD optimiza acabe siendo igual de rápido, Vale!!
ACLARA2: ...pero y si no se optimiza o no se dan las condiciones...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #14  
Antiguo 27-06-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.285
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por ramiretor
¿cómo le hago para que la consulta me regrese solo un registro en el caso de que la tabla exista?.

Código SQL [-]
  select campo1 from tablax
    where rownum < 2;
Código SQL [-]
   SELECT TOP 1 campoPK FROM tablax WHERE Name = 'tabla4'
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #15  
Antiguo 27-06-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.285
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por roman
Originalmente publicado por manual de MySql
COUNT(*) on a single table without a WHERE ....
Hombre así claro!!!
Ya me imagino que el count de todas las tablas (sin WHERE) está almacenado en algun sitio, el problema es que sí hay un WHERE (inicialmente el WHERE era el nombre de la tabla: 'TABLA4'), por lo tanto ese valor no hay forma de tenerlo precalculado.
Si hay WHERE hay que contar...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 19:17:00.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi