2010-09-01 14 views
10

Para ejemplos no sé el número de filas en cada tabla son y trato de hacer como esto:Las instrucciones SELECT utilizadas tienen un número diferente de columnas

SELECT * FROM members 
UNION 
SELECT * FROM inventory 

Qué puedo poner a la segunda SELECT en lugar de * para eliminar este error sin agregar NULL 's?

+6

¿Por qué querría unir dos tablas de contextos completamente diferentes? – Joe

+2

Nunca use select * en ninguna consulta que se ejecute en producción. Siempre debe especificar solo las columnas que necesita tanto para la mantenibilidad como para el rendimiento. – HLGEM

Respuesta

9

Ponga los nombres de las columnas explícitamente en lugar de *, y asegúrese de que la cantidad de columnas y tipos de datos coinciden para la misma columna en cada selección.

Actualización:

Realmente no creo que usted quiere ser unificante esas tablas, basado en los nombres de las tablas. No parecen contener datos relacionados. Si publica su esquema y describe lo que está tratando de lograr, es probable que podamos brindarle una mejor ayuda.

+0

No sé nada sobre ningún nombre, nada. ¿Todavía es posible? –

+0

¿Por qué se modificó esta votación? –

+1

@hey: use 'DESC your_table_name' para averiguar las columnas y sus tipos de datos antes de escribir la consulta UNION. –

6

que podría hacer

SELECT * 
from members 
UNION 
SELECT inventory.*, 'dummy1' AS membersCol1, 'dummy2' AS membersCol2 
from inventory; 

Dónde membersCol1, membersCol12, etc ... son los nombres de las columnas de members que no están en inventory. De esta forma, ambas consultas en la unión tendrán las mismas columnas (suponiendo que todas las columnas en inventory son las mismas que en members, lo cual me parece muy extraño ... pero bueno, es su esquema).

ACTUALIZACIÓN:

Como HLGEM señaló, esto será solamente trabajo si inventory tiene columnas con los mismos nombres que members, y en el mismo orden. Nombrar todas las columnas explícitamente es la mejor idea, pero como no sé los nombres, no puedo hacer eso exactamente. Si lo hiciera, podría ser algo como esto:

SELECT id, name, member_role, member_type 
from members 
UNION 
SELECT id, name, '(dummy for union)' AS member_role, '(dummy for union)' AS member_type 
from inventory; 

no me gusta usar NULL para valores ficticios, porque entonces no siempre está claro qué parte de la Unión un registro vino de - el uso de 'maniquí' hace claro que el registro es de la parte de la unión que no tenía ese registro (aunque a veces esto podría no importar). La sola idea de unir estas dos tablas me parece muy extraña porque dudo mucho que tengan más de 1 o 2 columnas con el mismo nombre, pero usted hizo la pregunta de tal manera que imagino que en su escenario esto de alguna manera tiene sentido.

+1

¿Por qué no utilizar 'NULL' en lugar de 'dummy1' y 'dummy2'? – dan04

+0

Aunque esto funcione, aún necesita especificar los nombres de las columnas, ya que las columnas pueden estar o no en el mismo orden en ambas tablas (o permanecer en el mismo orden para siempre). Además, si el inventario tenía una columna añadida, la unión se rompería. Nunca haga un UNOIN sin especificar las columnas. También todas las uniones se deben considerar como candidatas de UNIÓN TODO, que es mucho más eficaz si no hay posibilidad de que los engañados necesiten ser filtrados. – HLGEM

+0

Decir cómo hacer algo que es tan obviamente incorrecto es herir al pobre tipo haciendo la pregunta, no ayudándolo. – ErikE

2

¿Estás seguro de que no quieres una unión? Es poco probable que UNOIN le proporcione lo que desea dado el nombre de la tabla.

0

No sé cuántas filas en cada tabla

¿Seguro que esto no es lo que quiere?

SELECT 'members' AS TableName, Count(*) AS Cnt FROM members 
UNION ALL 
SELECT 'inventory', Count(*) FROM inventory 
Cuestiones relacionadas