Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   pregunta SQL interesante (https://www.clubdelphi.com/foros/showthread.php?t=22611)

Barzaugc 21-06-2005 16:36:23

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.

jachguate 21-06-2005 16:40:24

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.

;)

Neftali [Germán.Estévez] 21-06-2005 17:00:39

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'

roman 21-06-2005 17:20:25

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

Barzaugc 21-06-2005 17:21:32

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? .

Neftali [Germán.Estévez] 21-06-2005 17:28:02

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.

ramiretor 23-06-2005 00:17:06

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

Neftali [Germán.Estévez] 23-06-2005 10:21:58

...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?

roman 23-06-2005 16:08:27

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

ramiretor 23-06-2005 16:43:22

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

jachguate 23-06-2005 17:02:56

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.

;)

roman 23-06-2005 17:12:41

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.

:D :D

// Saludos

Neftali [Germán.Estévez] 27-06-2005 11:45:13

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...

Neftali [Germán.Estévez] 27-06-2005 11:47:44

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'

Neftali [Germán.Estévez] 27-06-2005 11:51:28

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...


La franja horaria es GMT +2. Ahora son las 19:53:34.

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