gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:53:10 25 4
gpt4 key购买 nike

我在一个由大约 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com