2010-07-29 12 views
14

Tengo dos tablas con una cantidad variable de columnas. (No sé cuántas columnas o lo estarán allí nombres), por ejemplo, los cuadros A y B.combinación interna de SQL dos tablas con los mismos nombres de columna

TableA:

ID | B_ID | {variable} 

TableB

ID | {variable} 

Consulta:

SELECT TableA.*, TableB.* FROM TableA INNER JOIN TableB ON TableA.B_ID= TableB.id; 

Cuando TableA y TableB tienen una columna con el mismo nombre, no puedo distinguir entre las dos columnas diferentes. Por ejemplo de ambas tablas tiene la columna "Nombre" esta consulta se traduciría en:

ID | ID | B_ID | NAME | NAME | 
1 | 35 | 35 | bob | jim | 

Lo que estoy buscando es una forma de diferenciar entre las dos tablas. Preferiblemente con un prefijo para los nombres de columna tales como.

TableA_ID | TableB_ID | TableA_B_ID | TableA_NAME | TableB_NAME | 
     1 |  35 |   35 |   bob |   jim | 

sé del "AS" palabra clave, pero el problema es que no sé lo que los nombres de las columnas van a ser antes de la mano. (No sé si TableA o TableB van a tener el nombre de columna)

Así que mi pregunta es

¿Cómo diferencias entre las columnas de las dos tablas con un INNER JOIN cuando las tablas pueden tener la los mismos nombres de columna?

Estoy usando SQLite3.

Respuesta

13

Su conjunto de resultados (dada su consulta) debe tener todas las columnas TableA seguidas por todas las columnas TableB, de modo que cuando llegue a la segunda columna ID, sabrá que está en los datos TableB.

Dicho esto, es que parecería extraño para mí que está consultando todos los datos de dos tablas que no conoce nada ... funcionalmente

+1

Suena como un tipo de SQL dinámico funky que puede consultar las tablas que se generan en tiempo de ejecución por el usuario. – FrustratedWithFormsDesigner

+3

De acuerdo, si no conoce los nombres de las columnas, hay un problema grave con su diseño. Las sentencias de selección nunca deben usar select *, los nombres de columna siempre se deben especificar, especialmente en join, donde se devuelve la misma columna dos veces, esto supone un desperdicio de recursos del servidor. – HLGEM

+0

Si las tablas se están creando, tienen nombres de columna que se pueden capturar entonces, aunque ... – AllenG

6

Ésta es ciertamente una solución de corte, pero esto:

SELECT TableA.*, "#", TableB.* 
FROM TableA INNER JOIN TableB ON TableA.B_ID= TableB.id; 

Produciría una lista de resultados que se dividiría en dos bloques, a la izquierda y derecha de la columna #.

Cuestiones relacionadas