¿Cuándo se requiere dar un alias a un nombre de tabla en SQL?

Me di cuenta al hacer una consulta con múltiples JOIN que mi consulta no funcionaba a menos que le diera un alias a uno de los nombres de la tabla.

Aquí hay un ejemplo simple para explicar el punto:

Este planteamiento de « no se trabajo:

SELECT subject
from items
join purchases on items.folder_id=purchases.item_id
join purchases on items.date=purchases.purchase_date
group by folder_id

Este planteamiento de « :

SELECT subject
from items
join purchases on items.folder_id=purchases.item_id
join purchases as p on items.date=p.purchase_date
group by folder_id

¿Alguien puede explicar esto?

preguntado el 03 de mayo de 12 a las 15:05

6 Respuestas

Está utilizando la misma tabla Compras dos veces en la consulta. Necesitas diferenciarlos dándoles un nombre diferente.

Necesitas dar un alias:

  • When the same table name is referenced multiple times

Imagina dos personas que tienen exactamente el mismo John Doe. Si llama a John, ambos responderán a su llamada. No puede dar el mismo nombre a dos personas y asumir que sabrán a quién está llamando. De manera similar, cuando proporciona el mismo conjunto de resultados con el mismo nombre, SQL no puede identificar de cuál tomar los valores. Debe dar diferentes nombres para distinguir los conjuntos de resultados para que el motor SQL no se confunda.

Script 1: t1 y t2 son los nombres de alias aquí

SELECT      t1.col2
FROM        table1 t1
INNER JOIN  table1 t2
ON          t1.col1 = t2.col1
  • When there is a derived table/sub query output

Si una persona no tiene nombre, la llamas y como no puedes llamar a esa persona, no te responde. De manera similar, cuando genera una salida de tabla derivada o una salida de subconsulta, es algo desconocido para el motor SQL y no sabrá a qué llamar. Por lo tanto, debe dar un nombre a la salida derivada para que el motor SQL pueda manejar adecuadamente esa salida derivada.

Script 2: t1 es el nombre de alias aquí.

SELECT col1
FROM
(
    SELECT col1
    FROM   table1
) t1

contestado el 03 de mayo de 12 a las 15:05

La única vez que se REQUIERE proporcionar un alias es cuando hace referencia a la tabla varias veces y cuando tiene salidas derivadas (subconsultas que actúan como tablas) (gracias por captar eso, Siva). Esto es para que pueda deshacerse de las ambigüedades entre qué referencia de tabla usar en el resto de su consulta.

Para elaborar más, en su ejemplo:

SELECT subject
from items
join purchases on items.folder_id=purchases.item_id
join purchases on items.date=purchases.purchase_date
group by folder_id

Mi suposición es que usted siente que cada join y su correspondiente on usará la tabla de correlación, sin embargo, puede usar cualquier referencia de tabla que desee. Entonces, lo que pasa es que cuando dices on items.date=purchases.purchase_date, el motor SQL se confunde en cuanto a si se refiere a la primera tabla de compras o a la segunda.

Al agregar el alias, ahora se deshace de las ambigüedades al ser más explícito. El motor SQL ahora puede decir con 100% de certeza qué versión de compras desea usar. Si tiene que adivinar entre dos opciones iguales, siempre arrojará un error pidiéndole que sea más explícito.

contestado el 03 de mayo de 12 a las 15:05

Es necesario darles un nombre cuando la misma tabla se usa dos veces en una consulta. En su caso, la consulta no sabría de qué tabla elegir compras.fecha_de_compra.

contestado el 03 de mayo de 12 a las 15:05

En este caso, es simplemente que ha especificado compras dos veces y el motor SQL debe poder hacer referencia a cada conjunto de datos en la combinación de una manera única, por lo que se necesita el alias.

Como punto adicional, ¿realmente necesita unirse a las compras dos veces? ¿No funcionaría esto?

SELECT 
    subject
from 
    items
    join purchases 
        on items.folder_id=purchases.item_id
        and items.date=purchases.purchase_date
group by folder_id

contestado el 03 de mayo de 12 a las 15:05

gracias Dave, oh, eso es bueno, ¡no había pensado en esa solución! - tim peterson

Los alias son necesarios para eliminar la ambigüedad de la tabla de la que se obtiene una columna.

Por lo tanto, si el nombre de la columna es único en la lista de todas las columnas posibles disponibles en las tablas de la lista de, entonces puede usar el nombre de la columna directamente.

Si el nombre de la columna se repite en varias de las tablas disponibles en la lista de, entonces el servidor de base de datos no tiene forma de adivinar cuál es la tabla correcta para obtener la columna.

En su consulta de muestra, todos los nombres de las columnas están duplicados porque está obteniendo "dos instancias" de la misma tabla (compras), por lo que el servidor necesita saber de cuál de las instancias tomará la columna. Entonces debes especificarlo.

De hecho, le recomiendo que use siempre un alias, a menos que haya una sola tabla. De esta manera, evitará muchos problemas y hará que la consulta sea mucho más clara de entender.

contestado el 03 de mayo de 12 a las 15:05

No puede usar el mismo nombre de tabla en la misma consulta A MENOS que tenga un alias como otra cosa para evitar una condición de combinación ambigua. Por eso no está permitido. Debo señalar que también es mejor usar siempre calificar table.field o alias.field para que otros desarrolladores detrás de usted no tengan que adivinar qué columnas provienen de qué tablas.

Al escribir una consulta, USTED sabe con qué está trabajando, pero ¿qué hay de la persona detrás de usted en el desarrollo? Si alguien no está acostumbrado a qué columnas provienen de qué tabla, puede ser ambiguo seguirlo, especialmente aquí en S/O. Al calificar siempre usando la referencia y el campo de la tabla, o la referencia y el campo del alias, es mucho más fácil de seguir.

select
      SomeField,
      AnotherField
   from
      OneOfMyTables
         Join SecondTable
            on SomeID = SecondID

comparar eso con

select
      T1.SomeField,
      T2.AnotherField
   from
      OneOfMyTables T1
         JOIN SecondTable T2
            on T1.SomeID = T2.SecondID

En estos dos escenarios, ¿cuál preferiría leer? Tenga en cuenta que he simplificado la consulta usando alias más cortos "T1" y "T2", pero podrían ser cualquier cosa, incluso un acrónimo o un alias abreviado de los nombres de las tablas. "oomt" (una de mis tablas) y "st" (segunda tabla). O, como algo super largo como ha estado en otros posts...

Select * from ContractPurchaseOffice_AgencyLookupTable

vs 

Select * from ContractPurchaseOffice_AgencyLookupTable  AgencyLkup

Si tuviera que seguir calificando uniones o columnas de campo, ¿cuál preferiría ver?

Espero que esto aclare tu pregunta.

contestado el 03 de mayo de 12 a las 16:05

hola DRapp, gracias, estoy un poco confundido con tu oración "... también es mejor usar siempre calificar table.field...". ¿Puedes ampliar eso? - tim peterson

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.