PDA

Ver la Versión Completa : pregunta SQL interesante


Barzaugc
21-06-2005, 16:36:23
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í:


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í:


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 (*)


select TOP 1 Name from sysobjects where Name = 'tabla4' andxtype='U'

roman
21-06-2005, 17:20:25
En MySql sería:


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:


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


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:



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


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
...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
tal como ya habia especulado roman


¡Ah! ¡No señor! Yo no es-pe-cu-lo


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
...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
¿cómo le hago para que la consulta me regrese solo un registro en el caso de que la tabla exista?.


select campo1 from tablax
where rownum < 2;



SELECT TOP 1 campoPK FROM tablax WHERE Name = 'tabla4'

Neftali [Germán.Estévez]
27-06-2005, 11:51:28
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...