Anexos del Tutorial de SQL y resolución de problemas
16 ANEXOS
16.1 Resolución
de Problemas
16.1.1 Buscar
Información duplicada en un campo de una tabla.
Para generar este tipo de consultas lo
más sencillo es utilizar el asistente de consultas de Access,
editar la sentencia SQL de la
consulta y pegarla en nuestro código. No obstante este tipo de consulta
se consigue de la siguiente forma:
SELECT DISTINCTROW Lista de Campos a Visualizar FROM Tabla WHERE CampoDeBusqueda In (SELECT CampoDeBusqueda FROM Tabla As psudónimo GROUP BY CampoDeBusqueda HAVING Count(*)>1 ) ORDER BY CampoDeBusqueda;
Un caso práctico, si deseamos localizar
aquellos empleados con igual nombre y visualizar su código correspondiente,
la consulta sería la siguiente:
SELECT DISTINCTROW Empleados.Nombre, Empleados.IdEmpleado FROM Empleados WHERE Empleados.Nombre In (SELECT Nombre FROM Empleados As Tmp GROUP BY Nombre HAVING Count(*)>1) ORDER BY Empleados.Nombre;
16.1.2 Recuperar Registros de una tabla
que no contengan registros relacionados en otra.
Este tipo de consulta se emplea en situaciones
tales como saber que productos no se han vendido en un determinado periodo de
tiempo,
SELECT DISTINCTROW Productos.IdProducto, Productos.Nombre FROM Productos LEFT JOIN Pedidos ON Productos.IdProducto = Pedidos.IdProduct WHERE (Pedidos.IdProducto Is Null) AND (Pedidos.Fecha Between #01-01-98# And #01-30-98#);
La sintaxis es sencilla, se trata de realizar
una unión interna entre dos tablas seleccionadas mediante un LEFT
JOIN, estableciendo como condición que el campo relacionado
de la segunda sea Null.
16.2 Utlizar
SQL desde Visual Basic
Existen dos tipos de consultas SQL:
las consultas de selección (nos devuelven datos) y las consultas de acción
(aquellas que no devuelven ningún registro). Ambas pueden ser tratadas
en Visual Basic pero de forma diferente.
Las consultas de selección se ejecutan
recogiendo la información en un recordset previamente definido mediante
la instrucción openrecordset(),
por ejemplo:
Dim SQL as String Dim RS as recordset SQL = "SELECT * FROM Empleados;" Set RS=MiBaseDatos.OpenRecordSet(SQL)
Si la consulta de selección se
encuentra almacenada en una consulta de la base de datos:
Set RS=MiBaseDatos.OpenRecordset("MiConsulta")
Las consultas de acción, al no
devolver ningún registro, no las podemos asignar a ningún recordset,
en este caso la forma de ejecutarlas es mediante los métodos Execute
y ExecuteSQL (para bases de datos
ODBC), por ejemplo:
Dim SQL as string SQL = "DELETE * FROM Empleados WHERE Categoria = 'Ordenanza';" MiBaseDatos.Execute SQL
16.3 Funciones de Visual Basic utilizables
en una Instrucción SQL
| Función | Sintaxis | Descripción |
| Now | Variable= Now | Devuelve la fecha y la hora actual del sistema |
| Date | Variable=Date | Devuelve la fecha actual del sistema |
| Time | Variable=Time | Devuelve la hora actual del sistema |
| Year | Variable=Year(Fecha) | Devuelve los cuatro dígitos correspondientes al año de Fecha |
| Month | Variable=Month(Fecha) | Devuelve el número del mes del parámetro fecha. |
| Day | Variable=Day(Fecha) | Devuelve el número del día del mes del parámetro fecha. |
| Weekday | Variable=Weekday(Fecha) | Devuelve un número entero que representa el día de la semana del parámetro fecha. |
| Hour | Variable=Hour(Hora) | Devuelve un número entre 0 y 23 que representa la hora del parámetro Hora. |
| Minute | Variable=Minute(Hora) | Devuelve un número entre 0 y 59 que representa los minutos del parámetro hora. |
| Second | Variable=Second(Hora) | Devuelve un número entre 0 y 59 que representa los segundos del parámetro hora. |
DatePart
Esta función devuelve una parte
señalada de una fecha concreta. Su sintaxis es:
DatePart(Parte, Fecha, ComienzoSemana, ComienzoAño)
Parte representa a la porción de
fecha que se desea obtener, los posibles valores son:
|
ComienzoSemana indica el primer día de la semana. Los posibles valores son:
|
ComienzoAño indica cual es la primera semana del año; los posibles valores son:
|
16.4 Evaluar valores antes de ejecutar la Consuta.
Dentro de una sentencia SQL podemos emplear la función iif para
indicar las condiciones de búsqueda. La sintaxis de la función iif es la siguiente:
iif(Expresion,Valor1,Valor2)
En donde Expresión es
la sentencia que evaluamos; si Expresión es verdadera entonces
se devuelve Valor1, si Expresión es falsa se devuelve
Valor2.
SELECT * Total FROM Empleados WHERE Apellido = iff(TX_Apellido.Text <> '', TX_Apellido.Text, *) ;
Supongamos que en un formulario tenemos
una casilla de texto llamada TX_Apellido. Si cuando ejecutamos esta
consulta la casilla contiene algún valor se devuelven todos los empleados
cuyo apellido coincida con el texto de la casilla, en caso contrario se devuelven
todos los empleados.
<preSELECT Fecha, Producto, Cantidad, (iif(CodigoPostal>=28000 And CodigoPostal <=28999,'Madrid','Nacional')) AS Destino FROM Pedidos;
Esta consulta devuelve los campos Fecha,
Nombre del Producto y Cantidad de la tabla pedidos, añadiendo
un campo al final con el valor Madrid si el código posta está dentro del intervalo, en caso contrario devuelve Nacional.
16.5 Un Pequeño Manual de Estilo
Siempre es bueno intentar hacer las cosas
de igual modo para que el mantenimiento y la revisión nos sea una labor
lo más sencilla posible. En lo que a mi respecta utilizo las siguiente
normas a la hora de elaborar sentencias SQL:
- Las cláusulas siempre las escribo
con Mayúsculas. - Los operadores lógicos de sentencias
siempre con Mayúsculas. - Las operaciones siempre la primera
letra con mayúsculas y el resto en minúsculas. - Los operadores lógicos incluidos
en otros operadores la primera letra con mayúsculas y el resto con
minúsculas.
Los Nombres de las Tablas, Campos y Consultas,
los escribo siempre la primera letra con mayúsculas y el resto con minúsculas,
en algunos casos utilizo el carácter "_" para definir mejor
el nombre: Detalles_Pedidos.
Aunque con el motor Jet se pueden utilizar
acentos y espacios en blanco para nombrar los campos, las tablas y las consultas
no los utilizo porque cuando se exportar tablas a otros sistemas los acentos
y los espacios en blanco pueden producir errores innecesarios.
Recuerda siempre que si utilizas espacios
en blanco para llamar tablas o consultas cada vez que hagas referencias a ellos
en una consulta debes incluir sus nombres entre corchetes.
SELECT [ID de Pedido], [Nombre del
Producto], Cantidad FROM [Detalles del Pedido];
Más información
Asegurate de revisar el foro de Bases de datos en Foros del Web para resolución de cualquier duda.

- Introducción
- Consultas
de Selección - Criterios
de Selección - Agrupamiento
de Registros y Funciones Agregadas - Consultas
de Actualización - Tipos
de Datos - SubConsultas
- Consultas
y Referencias Cruzadas - Consultas
de Unión Interna - Consultas
de Unión Externas - Estructuras
de las Tablas - Consultas
con Parámetros - Acceso
a las Bases de Datos Externas - Omitir los permisos de ejecución
- La
Cláusula Procedure - Anexos