sql >> Base de Datos >  >> RDS >> Oracle

Sintaxis de Oracle:¿deberíamos elegir entre lo antiguo y lo nuevo?

Algo similar aquí, pero no tantos desarrolladores, y no tan antiguo de código. Estoy usando las cosas más nuevas, los chicos mayores están usando el estilo antiguo, pero ambos sabemos lo que el otro está tratando de hacer.

Personalmente, diría que vaya con el estilo que sea más fácil de usar para el desarrollador individual. A menos que ejecute puntos de referencia y descubra que uno es más rápido que el otro (es decir, una diferencia suficiente para ser significativa), y tanto los nuevos como los antiguos pueden leer y comprender las consultas que ven, no hay motivo para cambiarlos.

Sin embargo, mi voto personal sería dejar las cosas antiguas como están y escribir nuevas consultas usando la sintaxis más nueva, como usar JOIN s y USING y ON etc. son mucho más fáciles de leer y saber lo que está pasando, luego tener un montón de AND x.col = y.col AND z.col = a.col en el WHERE sección.

Eso, y los nuevos probablemente estarán por más tiempo, así que eventualmente se saldrán con la suya...

Un ejemplo añadido

No sé el resto de ustedes, pero odiaría tener que intentar resolver algo como esto (o escribir esto) usando el viejo estilo de unión:

SELECT DISTINCT product_zone_map_id, zh.name_english, zh.name_french, zone_id, ad.attribute_value_english AS bullprep_region_type,
        product_zone_type_id, ad.attribute_value_english, language_english, product_code, office_code,
        (
            SELECT attribute_value_english
            FROM presentation p JOIN presentation_details ad USING(presentation_id)
            WHERE dimension_id = 4
              AND object_id = product_zone_map_id
              AND attribute_type = 'BULLPREP PARENT ID'
              AND p.usage_start_date <= TO_TIMESTAMP('2010-05-12', 'yyyy-mm-dd hh24:mi:ss')
              AND (p.usage_end_date >= TO_TIMESTAMP('2010-05-12', 'yyyy-mm-dd hh24:mi:ss') OR p.usage_end_date IS NULL)
        ) AS bullprep_parent_id,
        (
            SELECT attribute_value_english
            FROM presentation p JOIN presentation_details ad USING(presentation_id)
            WHERE dimension_id = 4
              AND object_id = product_zone_map_id
              AND attribute_type = 'BULLPREP GROUP ID'
              AND p.usage_start_date <= TO_TIMESTAMP('2010-05-12', 'yyyy-mm-dd hh24:mi:ss')
              AND (p.usage_end_date >= TO_TIMESTAMP('2010-05-12', 'yyyy-mm-dd hh24:mi:ss') OR p.usage_end_date IS NULL)
        ) AS bullprep_group_id, product_zone_seq
FROM zone z JOIN zone_history zh ON(z.zone_id = zh.zone_id)
     JOIN product_zone_map pzm ON(z.zone_id = pzm.zone_id)
     JOIN product USING(product_id)
     JOIN product_history ph USING(product_id)
     JOIN language_reference USING(language_id)
     LEFT OUTER JOIN product_zone_attribute_details pzad USING(product_zone_map_id)
     LEFT OUTER JOIN attribute_details ad USING(attribute_id)
     JOIN zone_geocode_map USING(zone_id)
     JOIN geocode USING(geocode_id)
WHERE zh.usage_start_date <= TO_TIMESTAMP('2010-05-12', 'yyyy-mm-dd hh24:mi:ss')
  AND (zh.usage_end_date >= TO_TIMESTAMP('2010-05-12', 'yyyy-mm-dd hh24:mi:ss') OR zh.usage_end_date IS NULL)
  AND pzm.usage_start_date <= TO_TIMESTAMP('2010-05-12', 'yyyy-mm-dd hh24:mi:ss')
  AND (pzm.usage_end_date >= TO_TIMESTAMP('2010-05-12', 'yyyy-mm-dd hh24:mi:ss') OR pzm.usage_end_date IS NULL)
  AND (attribute_type = 'BULLPREP REGION TYPE' OR attribute_type IS NULL)
  AND product_id = 2075
ORDER BY product_zone_seq