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.

¿Fue útil?

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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top