Obteniendo filas adicionales – Después de unir las 3 tablas usando Left Join

SELECT (b.descr || ' - ' || c.descr) description FROM tbl1 a LEFT JOIN tbl2 b ON a.ACCOUNT = b.ACCOUNT LEFT JOIN tbl3 c ON a.product = c.product WHERE a.descr50 = ' ' ; 

table1 tiene solo 7622 filas con descr50 = '' pero esta selección devuelve 7649 filas. ¿Podrías ayudarme en esto? gracias por adelantado

Cuando JOIN dos o más tablas juntas, obtiene efectivamente un producto cartesiano para estas tablas a las cuales se aplica un filter indicado en la condición JOIN .

Esto es más obvio cuando usa una syntax JOIN implícita obsoleta.

LEFT JOIN garantiza que obtendrá no less filas que las que contiene la tabla situada más a la izquierda, es decir, cada fila de la tabla situada más a la izquierda se devuelve al less una vez.

Todavía puede get más filas, si el filter no es una asignación de fila de uno a uno.

En tu caso:

 SELECT (b.descr || ' - ' || c.descr) description FROM tbl1 a LEFT JOIN tbl2 b ON b.ACCOUNT = a.ACCOUNT LEFT JOIN tbl3 c ON c.product = a.product WHERE a.descr50 = ' ' 

ya sea la count o el product no son únicos en b c .

Para estas filas:

 a.account 1 2 3 b.account b.description 1 Account 1 2 Account 2 - old 2 Account 2 - new 

, JOIN devolverá lo siguiente:

 a.account b.account b.description 1 1 Account 1 2 2 Account 2 - old 2 2 Account 2 - new 3 NULL NULL 

, que le da más filas que cualquiera de las tablas contiene.

Para simplemente elegir la primera descripción que coincida de cualquiera de las tablas, use esto:

 SELECT ( SELECT FIRST_VALUE(descr) OVER (ORDER BY descr) FROM tbl2 b WHERE b.account = a.account AND rownum = 1 ) || ' - ' || ( SELECT FIRST_VALUE(descr) OVER (ORDER BY descr) FROM tbl3 c WHERE c.product= a.product AND rownum = 1 ) description FROM tbl1 a WHERE a.descr50 = ' ' 

Para actualizar, simplemente ajuste la consulta en una vista en línea:

 UPDATE ( SELECT ( SELECT FIRST_VALUE(descr) OVER (ORDER BY descr) FROM tbl2 b WHERE b.account = a.account AND rownum = 1 ) || ' - ' || ( SELECT FIRST_VALUE(descr) OVER (ORDER BY descr) FROM tbl3 c WHERE c.product= a.product AND rownum = 1 ) description FROM tbl1 a WHERE a.descr50 = ' ' ) SET descr50 = description 

table1 puede tener solo 7622 filas, pero si tbl2 tiene más de una fila con el mismo valor de CUENTA, o si tbl3 tiene más de una fila donde coincide el producto, obtendrá más filas en el set de resultados. Estás efectivamente "multiplicando" cada una de las tablas.


EDITAR : OK, un ejemplo.

Supongamos que tbl1 tiene solo 1 fila, y que la "CUENTA" es 1 y el "producto" es 2. (No sé qué valores reales hay en la tabla, no importa).

Ahora supongamos que tbl2 tiene 2 filas donde "CUENTA" es 1. Directamente, obtendrá al less 2 filas en sus resultados, porque tbl1 coincidirá con 2 filas en tbl2.

Ahora bien, si tbl3 tiene 2 filas donde "producto" es 2, obtendrá 4 filas en los resultados, porque cada uno de los 2 resultados anteriores coincidirá con 2 filas en tbl3.

Así que con suerte puedes ver por qué estás obteniendo más filas de las que esperabas. Lo que eliges hacer al respecto es una cuestión diferente, y depende de si el hecho de que haya múltiples coincidencias en tbl2 y tbl3 indica un problema con los datos.

Como testing para determinar de dónde provienen las filas adicionales, intente agregar más campos a su instrucción SELECT de las tablas combinadas y observe los datos devueltos.

Una opción para corregir el problema es agrupar las tablas unidas después de unirlas:

 SELECT (b.descr || ' - ' || c.descr) description FROM tbl1 a LEFT JOIN tbl2 b ON a.ACCOUNT = b.ACCOUNT LEFT JOIN tbl3 c ON a.product = c.product WHERE a.descr50 = ' ' GROUP BY b.descr, c.descr 

Otra opción sería agrupar sus tablas tbl2 y tbl3 antes de join a ellas:

 SELECT (b.descr || ' - ' || c.descr) description FROM tbl1 a LEFT JOIN ( SELECT descr, ACCOUNT FROM tbl2 GROUP BY descr, ACCOUNT ) AS b ON a.ACCOUNT = b.ACCOUNT LEFT JOIN ( SELECT descr, product FROM tbl3 GROUP BY descr, product ) AS c ON a.product = c.product WHERE a.descr50 = ' '