2012-05-03 21 views
5

Me di cuenta al hacer una consulta con múltiples JOINs que mi consulta no funcionaba a menos que di un alias a uno de los nombres de la tabla.¿Cuándo se requiere dar un nombre de tabla a un alias en SQL?

Aquí está un ejemplo sencillo para explicar el punto:

Este no 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 

Esto hace :

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 

Puede alguien explicar esto?

Respuesta

5

Está utilizando la misma tabla de Compras dos veces en la consulta. Necesita diferenciarlos dando un nombre diferente.

que necesita para dar un alias:

  • When the same table name is referenced multiple times

imaginar a dos personas que tengan 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 llama. De manera similar, cuando se da el mismo conjunto de resultados llamado exactamente el mismo, SQL no puede identificar para tomar los valores. Debe dar diferentes nombres para distinguir los conjuntos de resultados para que el motor SQL no se confunda.

Guión 1: t1 t2 y 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 un nombre, llámalos y como no puedes llamar a esa persona, no responderán a tu tú De forma similar, cuando genera una salida de tabla derivada o una salida de sub consulta, es algo desconocido para el motor de SQL y no tendrá qué llamar. Por lo tanto, debe dar un nombre a la salida derivada para que el motor SQL pueda tratar adecuadamente con esa salida derivada.

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

SELECT col1 
FROM 
(
    SELECT col1 
    FROM table1 
) t1 
4

La única vez que se REQUIERE que proporcione un alias es cuando hace referencia a la tabla varias veces y cuando tiene salidas derivadas (sub-consultas que actúan como tablas) (gracias por atraparlo con Siva). Esto es para que pueda deshacerse de las ambigüedades entre las referencias de tablas que se utilizarán en el resto de su consulta.

seguir elaborando, 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 se siente que cada join y su correspondiente on utilizará la tabla de correlación, sin embargo se puede utilizar cualquier referencia de tabla que desea. Entonces, lo que sucede es que cuando dices on items.date=purchases.purchase_date, el motor de SQL se confunde en cuanto a si te refieres a la primera tabla de compras, o la segunda.

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

+0

@Siva corregido, gracias –

1

Se requiere darles un nombre cuando se usa la misma tabla dos veces en una consulta. En su caso, la consulta no sabría en qué tabla elegir purchase.purchase_date from.

0

No se puede usar el mismo nombre de tabla en la misma consulta A MENOS QUE se alias como algo más para evitar una condición ambigua de unión. Es por eso que no está permitido. Debo señalar, también es mejor usar siempre calificar table.field o alias.field para que otros desarrolladores detrás de ti 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 campo de alias, es mucho más fácil de seguir.

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

que para comparar

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

En estos dos escenarios, que prefiere leer ... Aviso, he simplificado la consulta utilizando alias cortos "T1" y "T2", pero podrían ser cualquier cosa, incluso un acrónimo o alias abreviado de los nombres de tabla ... "oomt" (una de mis tablas) y "st" (segunda tabla). O, como algo muy largo como ha sido en otras publicaciones ...

Select * from ContractPurchaseOffice_AgencyLookupTable 

vs 

Select * from ContractPurchaseOffice_AgencyLookupTable AgencyLkup 

Si tuviera que mantener la calificación se une, o columnas de campo, ¿Qué prefiere mirar.

Espero que esto aclare su pregunta.

+0

hola DRapp, gracias, estoy un poco confundido con su frase "... también es mejor usar siempre la tabla de clasificación. Campo ...". ¿Puedes expandirte sobre eso? –

1

En este caso se trata simplemente de que ha especificado compras dos veces y el motor de SQL necesita ser capaz de referirse a cada conjunto de datos en la combinación de una manera única, por lo tanto, se necesita el alias.

Como punto de lado, lo que realmente necesita para 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 
+0

gracias Dave, ¡oh qué bueno que no había pensado en esa solución! –

1

El alias son necesarios para eliminar la ambigüedad de la tabla de la que para obtener 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 en la lista, entonces usted puede utilizar el nombre coulmn directamente.

Si el nombre de la columna se repite en varias de las tablas disponibles en la lista de, a continuación, el servidor de base de datos no tiene manera de adivinar cuál es la tabla de la derecha para obtener la columna.

En su consulta de muestra, todos los nombres de las columnas están duplicados porque obtiene "dos instancias" de la misma tabla (compras), por lo que el servidor necesita saber de qué instancia tomar la columna. ASÍ debes especificarlo.

De hecho, te recomiendo que siempre uses un alias, a menos que haya una sola tabla. De esta forma, evitará muchos problemas y hará que la consulta sea mucho más clara de comprender.

Cuestiones relacionadas