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 listaFROM
.
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''