Oracle 语法——我们应该在新旧之间做出选择吗?

标签 oracle syntax

我在一个由大约 8 名开发人员组成的团队中处理大约 1'000'000 行源代码的代码库。我们的代码基本上是一个使用 Oracle 数据库的应用程序,但代码随着时间的推移不断发展(我们有大量 90 年代中期的源代码!)。

团队之间对我们用于查询 Oracle 数据库的语法产生了争议。目前,我们的绝大多数查询使用“旧的”Oracle 语法进行连接,这意味着我们的代码看起来像这样......

内连接示例

select customers.*
       , orders.date
       , orders.value 
from customers, orders
where customers.custid = orders.custid

外连接示例
select customers.custid
       , contacts.ContactName
       , contacts.ContactTelNo 
from customers, contacts 
where customers.custid = contacts.custid(+)

随着新开发人员加入团队,我们注意到他们中的一些人似乎更喜欢使用 SQL-92 查询,如下所示:

内连接示例
select customers.*
       , orders.date
       , orders.value 
from customers inner join orders 
     on (customers.custid = orders.custid)

外连接示例
select customers.custid
      , contacts.ContactName
      , contacts.ContactTelNo
from customers left join contacts 
      on (customers.custid = contacts.custid)

A组说每个人都应该使用“旧”语法——我们有很多这种格式的代码,我们应该重视一致性。现在我们没有时间通过​​代码重写数据库查询,如果我们这样做了,它也不会付钱给我们。他们还指出,“这是我们一直以来的做法,我们对此感到很满意……”

然而,B 组表示他们同意我们没有时间回去更改现有查询,我们真的应该在我们从现在开始编写的代码中采用"new"语法。他们说开发人员只是真的一次查看一个查询,只要开发人员知道这两种语法,就不会从死板地坚持旧语法中获得任何好处,旧语法在 future 的某个时候可能会被弃用。

在不声明我的忠诚度属于哪个群体的情况下,我很想听听公正观察者的意见——所以让游戏开始吧!

马丁。

附言。我已经把它变成了一个社区维基,以免被视为公然追问问题...

最佳答案

类似的事情在这里,但没有那么多的开发人员,也没有那么旧的代码。我正在使用较新的东西,年长的人正在使用较旧的风格,但我们都知道对方想要做什么。

就个人而言,我会说选择哪种风格对个人开发人员来说更容易使用。除非您运行基准测试并发现一个比另一个更快(例如,差异足够显着),并且新旧都可以阅读和理解他们看到的查询,否则没有理由更改它们。

然而,我个人的投票是保留旧的东西,并使用较新的语法编写新的查询,如使用 JOIN s 和 USINGON等等更容易阅读,知道发生了什么,然后有一堆 AND x.col = y.col AND z.col = a.colWHERE部分。

那,而且新人可能会待得更久,所以他们最终会如愿以偿……

一个附加的例子

不知道你们其他人,但我不想尝试使用旧式的加入来弄清楚(或写下)这样的事情:

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

关于Oracle 语法——我们应该在新旧之间做出选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2821854/

相关文章:

oracle - sql语法缺失和错误处理

parsing - Coq 表示法中的 `<` 语法错误

image - docker run image 导致语法错误/bin/sh

c# - 是否可以在三元表达式上只放置一个选项?

sql - update x set y = null 需要很长时间

sql - 删除重复的 Oracle xmlagg 列表

java - 如何从 Oracle JDBC PreparedStatement 对象获取绑定(bind)参数的值

java - 有没有办法将列的一部分映射到变量?

python - 如何使用dockerfile在python脚本中设置环境变量?

syntax - go lang 中的空函数名是什么意思?