Caso raro de Vistas en Subconsultas

Esto es un caso raro cuando se utilizan vistas. Generalmente se usan las vistas para disminuir la complejidad de las consultas. Y aveces se cambian los nombres de las tablas base que se usan con el mismo proposito.

Veamos que es lo raro. Si tenemos una vista, como la siguiente:

CREATE VIEW dbo.view_ajustes
AS
SELECT
dbo.Puntosventa.nombre AS PuntoVenta, dbo.productos.nombre AS ProductoVenta, dbo.ajustes.preciounitario AS Precio, dbo.ajustes.cantidad
FROM PuntosVenta inner join Productos on PuntosVenta.IdPuntoVenta = Productos.IdPuntoVenta inner join ajustes on productos.idproducto=ajustes.idproducto


Si se quiere realizar una consulta a esa vista:

select puntoventa,productoventa,preciounitario,cantidad
from view_ajustes


Se ejecuta sin error, dando como resultado las filas deseadas. Ahora utilizaremos la vista en una subconsulta.

select *
from puntosventa
where nombre in (select nombre from view_ajustes)


Esta consulta se ejecutará sin errores. Pero chequeenla. En la subconsulta se está utilizando la columna 'nombre' que no existe en la vista view_ajustes y no el campo 'puntoventa'. Aún así no hay errores y Sql Server puede "descifrar" a traves de la vista el nombre de la columna en la tabla base. Pues la columna 'nombre' si existe en la tabla base puntosventa.

Es más como en la misma vista se utilizan dos columnas con el mismo identificador 'nombre' de dos tablas diferentes, la anterior consulta se puede modificar para consultar la tabla productos, sin errores también.

select *
from productos
where nombre in (select nombre from view_ajustes)


Conclusión: Debe ser una "característica" en Sql Server 2000 (también pasa si prueban en Sql Server 2005), mediante la cual en una subconsulta que utilizan vistas, no importa utilizar el identificador utilizado en la vista o el identificador de la tabla base.

Fuente:
Sql Server Central.

No hay comentarios: