Combinación externa o consulta dinámica, que es el mejor camino a seguir?
-
18-09-2019 - |
Pregunta
Tengo las siguientes tablas (He simplificado los datos contenidos en las tablas).
RateTable
- rate_table_id [int]
- rate_table_name [nvarchar(50)]
RateTableUsed
- rate_used_id [int]
- rate_table_id [int] (key to RateTable.rate_table_id)
- customer_id [int]
RateTableExtra
- rate_table_extra_id [int]
- rate_ extra_id [int] (key to RateExtra.rate_table_id)
- rate_used_id [int] (key to RateTableUsed.rate_used_id)
RateExtra
- rate_ extra_id [int]
- rate_extra_name [nvarchar(50)]
select rate_table_name, rate_table_extra_id, rate_extra_name from RateTableUsed rtu
innerjoin RateTable rt on rtu.rate_table_id = rt.rate_table_id
innerjoin RateTableExtra rte on rte.rate_table_id = rt.rate_table_id
innerjoing RateExtr re on rte.rate_extra_id = re.rate_extra_id
El RateExtra contiene sólo 3 valores con clave de 1, 2 y 3 y el recargo de gasolina de nombres, comisión de gestión y GST.
Esta bien que está trabajando para su propósito actual. Una lista de valores se visualiza con los registros que coincidan y la RateExtra se consulta sólo para el rate_extra_name.
Así que puede tener los siguientes resultados:
- Ratetable1, 1, PetrolSurcharge
- Ratetable1, 2, ManagementFee
- Ratetable2, 3, PetrolSurcharge
- Ratetable4, 4, GST
- Ratetable6, 5, PetrolSurcharge
Me han pedido para modificar esto para que cada registro que devuelve ahora incluye registros para cada valor de la tabla RateExtra. Si no hay registros coincidentes a continuación los datos de mi mesa RateTableExtra deben volver como NULL. Así que mis datos deben volver como:
- Ratetable1, 1, PetrolSurcharge
- Ratetable1, 2, ManagementFee
- Ratetable1, NULL, GST
- Ratetable2, 3, PetrolSurcharge
- Ratetable2, NULL, ManagementFee
- Ratetable2, NULL, GST
- Ratetable4, NULL, PetrolSurcharge
- Ratetable4, NULL, ManagementFee
- Ratetable4, 4, GST
- Ratetable6, 5, PetrolSurcharge
- Ratetable6, NULL, ManagementFee
- Ratetable6, NULL, GST
He intentado EXTERIOR une pero no parece estar funcionando estoy asumiendo porque los datos RateExtra está vinculada a la RateTableExtra que devolver null. Ahora estoy considerando la creación de una consulta dinámica que hará que mi conjunto de resultados original, iterar sobre ella la comprobación de rate_extra_id y, si no es que ya están en el conjunto de resultados, añadiendo una nueva fila a los resultados con datos NULL en el que lo necesite. Estoy asumiendo que esto funcionaría pero tengo la sensación de que sería un asesino en el rendimiento.
¿Hay alguna forma mejor de hacer esto? Espero que alguien puede ayudar, sería muy apreciado.
Solución
Prueba esto:
select
rate_table_name,
rate_table_extra_id,
rate_extra
from
RateTableUsed rtu
inner join RateTable rt on
rtu.rate_table_id = rt.rate_table_id
cross join RateExtra re
left outer join RateTableExtra rte on
rte.rate_table_id = rt.rate_table_id
and rte.rate_extra_id = re.rate_extra_id
order by rt.rate_table_name, re.rate_extra_id
Lo que están consiguiendo con esta consulta es, en esencia, una combinación cartesiana entre RateTable
y RateExtra
, con un left join
para encontrar los valores de RateTableExtra
que coinciden con los pares. En esencia, esta consulta está trayendo de vuelta es posible combinaciones de RateTable
y RateExtra
, y mostrándole cuáles usted tiene en su mesa RateTableExtra
rápidamente.
Tenga cuidado con cartesiana se une. Ellos pueden ir de las manos muy rápidamente con mesas de tamaño razonable! Disfrutar!