varias unir tablas relacionadas multitablas inner hacer ejemplos diferentes datos consultas consultar consulta como sql postgresql join left-join multiple-tables

sql - unir - ejemplos de consultas en la base de datos northwind



MĂșltiples combinaciones a la izquierda en varias tablas en una consulta (3)

Este tipo de consulta debería funcionar, después de volver a escribir con sintaxis ANSI JOIN explícita:

SELECT something FROM master parent JOIN master child ON child.parent_id = parent.id LEFT JOIN second parentdata ON parentdata.id = parent.secondary_id LEFT JOIN second childdata ON childdata.id = child.secondary_id WHERE parent.parent_id = ''rootID''

El cable de activación aquí es que un JOIN explícito se enlaza antes del "estilo antiguo" CROSS JOIN con una coma ( , ). Cito el manual aquí:

En cualquier caso, JOIN enlaza más estrechamente que las comas que separan los elementos de la lista FROM .

Después de volver a escribir la primera, todas las combinaciones se aplican de izquierda a derecha (lógicamente, Postgres es libre de reorganizar las tablas en el plan de consulta) y funciona.

Solo para hacer mi punto, esto también funcionaría:

SELECT something FROM master parent LEFT JOIN second parentdata ON parentdata.id = parent.secondary_id , master child LEFT JOIN second childdata ON childdata.id = child.secondary_id WHERE child.parent_id = parent.id AND parent.parent_id = ''rootID''

Pero la sintaxis explícita de JOIN es generalmente preferible, como lo ilustra su caso una vez más.

Y tenga en cuenta que múltiples JOIN (IZQUIERDA) pueden multiplicar filas:

Tengo una tabla master , que tiene elementos almacenados en varios niveles, padres e hijos, y hay una segunda tabla que puede tener o no datos adicionales. Necesito consultar dos niveles de mi tabla maestra y tener una combinación izquierda en mi segunda tabla, pero debido al orden dentro de mi consulta esto no funcionará.

SELECT something FROM master as parent, master as child LEFT JOIN second as parentdata ON parent.secondary_id = parentdata.id LEFT JOIN second as childdata ON child.secondary_id = childdata.id WHERE parent.id = child.parent_id AND parent.parent_id = ''rootID''

La combinación izquierda solo funciona con la última tabla en la cláusula from, por lo que solo puedo hacer que funcione para una de las combinaciones izquierdas. En el ejemplo anterior, ninguna de las combinaciones a la izquierda funcionará porque la primera unión a la izquierda apunta hacia la primera tabla en la cláusula from, la segunda nunca funcionará de esta manera.

¿Cómo puedo hacer este trabajo?


Las sentencias JOIN también forman parte de la cláusula FROM , más formalmente, se utiliza un join_type para combinar dos elementos de from_item ''s en uno de from_item , uno de los cuales puede formar una lista separada por comas después de FROM . Consulte http://www.postgresql.org/docs/9.1/static/sql-select.html .

Así que la solución directa a su problema es:

SELECT something FROM master as parent LEFT JOIN second as parentdata ON parent.secondary_id = parentdata.id, master as child LEFT JOIN second as childdata ON child.secondary_id = childdata.id WHERE parent.id = child.parent_id AND parent.parent_id = ''rootID''

Una mejor opción sería usar solo JOIN , como ya se ha sugerido.


Puedes hacer asi

SELECT something FROM (a LEFT JOIN b ON a.a_id = b.b_id) LEFT JOIN c on a.a_aid = c.c_id WHERE a.parent_id = ''rootID''