2010-07-03 19 views
7

que estoy tratando de hacerseleccionar varias tablas cuando una tabla está vacía en MySQL

SELECT * FROM a, b 

Sin embargo, no devuelve nada si una de las mesas está vacía. ¿Cómo lo hago para que devuelva 'a' incluso si el otro está vacío?

+2

http://dev.mysql.com/doc/refman/5.0/en/join.html Está utilizando la forma de 'INNER JOIN' que resulta con registros x * y, entonces si 1 de ellos tiene 0 filas, entonces x * 0 = 0. –

Respuesta

19

El uso de dos tablas en la cláusula from es funcionalmente equivalente a un cross join:

select * 
from A 
cross join 
     B 

Esto devuelve una fila de A para cada fila en B. Cuando B está vacía, el resultado es demasiado vacía. Puedes arreglar eso usando un left join. Con un left join, puede devolver filas incluso si una de las tablas está vacía. Por ejemplo:

select * 
from A 
left join 
     B 
on  1=1 

medida que la condición 1=1 siempre es cierto, esto es como un cross join excepto que también trabaja para mesas vacías.

+0

FYI," En MySQL, CROSS JOIN es un equivalente sintáctico a INNER JOIN (pueden reemplazarse entre sí) " –

+0

@Imre L: Interesante. Probablemente aún sea más claro usar 'cross join' por convención si no hay una cláusula' on', ¡incluso si MySQL permite 'inner join' para el mismo propósito! – Andomar

+0

Sí. Personalmente prefiero omitir las palabras 'INTERIOR' y' CRUZ', etc. Pero no me gusta utilizar CROSS JOIN en línea cuando se usan algunas condiciones en la tabla unida. –

1
SELECT * FROM a LEFT JOIN b ON a.ID = b.ID 

Devolverá todo, incluso si b está vacío.

+0

Ha supuesto que hay campos para unir, puede que no haya un campo común. Sin campos comunes, esto no puede funcionar. Vea ON 1 = 1 en la respuesta. – strattonn

1

Debe hacer una combinación izquierda.

gusta esta

SELECT * 
FROM A 
LEFT JOIN B ON A.ID = B.ID 

a continuación, recibirá las filas de A y la fila correspondiente en B si existe.

+0

Ha supuesto que hay campos para unir, puede que no haya un campo común. Sin campos comunes, esto no puede funcionar. Vea ON 1 = 1 en la respuesta. Esa es la clave de toda la cuestión, unir conjuntos vacíos sin campos comunes. – strattonn

+0

Sí, tiene razón, en ese caso se requiere una unión cruzada o la condición 1 = 1 que es casi la misma. –

0

La consulta mencionada anteriormente muestra una combinación de ambas tablas si a contiene 2 registros yb contiene 7 registros, muestra 7 * 2 = 14 registros. En su caso, una de las tablas está vacía (con 0 registros), no mostrará ningún dato. Si aún desea visualizar datos y las tablas no tienen ninguna relación, debe verificar si el recuento de ambas tablas es mayor que 0. De lo contrario, se visualizan registros de una sola tabla que no está vacía.

1
SELECT a.*, b.* FROM a LEFT JOIN b ON a.id = b.id 

en este ejemplo la identificación es simplemente el nombre de ejemplo para unirse clave

+0

Supone que hay campos para unir, puede que no haya un campo común. Sin campos comunes, esto no puede funcionar.Vea ON 1 = 1 en la respuesta. – strattonn

Cuestiones relacionadas