【发布时间】:2013-01-19 12:27:18
【问题描述】:
有没有办法将 SQL 代码模块化,使其更具可读性和可测试性?
我的 SQL 代码经常变成一长串复杂的嵌套连接、内连接等,难以编写和调试。相比之下,在像 Javascript 或 Java 这样的过程语言中,人们会将离散的元素作为单独的函数夹出来,你可以按名称调用。
是的,可以将每个查询编写为完全独立的查询,存储在数据库中,或存储为存储过程,但通常我不想更改/弄乱数据库,只需查询就可以了,特别是如果 DBA 没有不希望向所有用户授予写权限。
例如,从概念上讲,一个复杂的查询可能很容易用伪代码描述如下:
(getCustomerProfile)
left join
(getSummarizedCustomerTransactionHistory)
using (customerId)
left join
(getGeographicalSummaries)
using (region, vendor)
...
我意识到从理论上的角度(以下几个链接)就该主题编写了很多内容,但我只是在寻找一种方法来使代码更容易正确编写,并且在编写后更易于阅读。也许只是语法糖来从视觉中抽象出复杂性,如果不是从执行中抽象出来的话,它会在我试图不看的文字 SQL 中编译下来。以此类推……
- 手写笔:CSS ::
- CoffeeScript : Javascript ::
- SAS 宏语言:SAS 语言 ::
- ? : SQL
如果特定的 SQL 风格很重要,我的大部分工作都在 PostgresQL 中。
http://lambda-the-ultimate.org/node/2440
【问题讨论】:
-
java == 程序? SQL == 程序错误
-
呜呜呜!这样做会失去你需要从 SQl 获得的最重要的东西之一,那就是性能。阅读的难易程度无关紧要,重要的是服务器制定一个体面的计划以最有效地获取数据的难易程度。不要试图将 OOP 概念应用于 SQL。 (顺便说一句,我发现 SQL 一点也不难调试,如果你这样做了,那么显然你需要更好地学习 SQL,而不是试图抽象它。)
-
@HLGEM 。 . .实际上,我认为它可以帮助优化器。例如,SQL Server 重新执行对 CTE 的每个引用这一事实,即使该查询给出了 little 提示 CTE 将被多次重用。跨度>
标签: sql abstraction