首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使复杂的SQL查询更易于编写?

如何使复杂的SQL查询更易于编写?
EN

Software Engineering用户
提问于 2012-04-16 02:41:55
回答 5查看 101.4K关注 0票数 41

我发现编写复杂的SQL查询非常困难,这些查询涉及多个表(至少3-4个)的联接,并涉及多个嵌套条件。要求我编写的查询很容易用几句话来描述,但可能需要大量欺骗性的代码才能完成。我发现自己经常使用临时视图来编写这些查询,这似乎有点麻烦。您可以提供哪些技巧,使这些复杂的查询更容易使用?更具体地说,如何将这些查询分解为实际编写SQL代码所需的步骤?

请注意,要求我编写的SQL是数据库课程作业的一部分,所以我不想要为我做这项工作的软件。我想真正理解我正在写的代码。

更多技术细节:

  • 数据库托管在本地计算机上运行的PostgreSQL服务器上。
  • 数据库非常小:只有7个表,最大的表只有大约50行。
  • SQL查询将通过LibreOffice基不改变地传递给服务器。
EN

回答 5

Software Engineering用户

回答已采纳

发布于 2012-04-16 14:58:43

我的大部分工作都是基于试图得到“正确”的答案,所以你可能会发现这里有一些性能问题。没有必要加速不正确的查询。

理解表中的关系--大多数都是一对多的。知道“很多”的桌子。标识连接所需的字段。

想一想左边的加入方案--从上个月开始选择所有员工和他们的薪水。如果他们上个月没拿到薪水怎么办?

了解结果集: 1)在电子表格中,手动为查询输入至少一条正确的记录。2)以足够简单的形式编写查询,以确定应该返回多少条记录。使用这两种方法来测试您的查询,以确保加入一个新表不会改变结果。

将查询分解为可管理的部分--不必一次全部编写。复杂查询有时只是简单查询的集合。

注意混合级别的聚合:如果您必须将每月、季度和年度的值放在相同的结果集中,则需要在对不同值分组的查询中分别计算它们。

知道何时联合,有时更容易将子组划分为他们自己的select语句。如果您有一个与经理和其他员工混合的表,并且在每一列上都必须根据其中一个组的成员身份执行Case语句,那么编写Manager查询和工会到员工查询可能会更容易。每个人都有自己的逻辑。显然,必须将来自不同表的项包含在不同的行中。

复杂/嵌套公式--尝试连续缩进,不要害怕使用多行。“以防万一”会把你逼疯的。花点时间把这些想清楚。把复杂的电脑留到最后。首先获取所选的正确记录。然后,在使用正确的值时,攻击复杂的公式。查看公式中使用的值将帮助您发现必须计算空值的区域,以及处理零错误除法的位置。

在添加新表时经常进行测试,以确保仍然得到所需的结果集,并知道哪个联接或子句是罪魁祸首。

票数 49
EN

Software Engineering用户

发布于 2012-04-16 17:36:59

这里有点模糊,但是如果您正在编写大量临时视图,也许您还没有意识到大多数地方您可以在SQL语句中放置一个表,这个表可以用一个查询来替换。

因此,与其将表A连接到临时视图B,不如将表A加入到作为临时视图B使用的查询中,例如:

代码语言:javascript
复制
    SELECT A.Col1, A.Col2, B.Col1,B.Col2
      FROM (SELECT RealTableZ.Col1, RealTableY.Col2, RealTableY.ID as ID
              FROM RealTableZ 
   LEFT OUTER JOIN RealTableY
                ON RealTableZ.ForeignKeyY=RealTableY.ID
             WHERE RealTableY.Col11>14
            ) As B
        INNER JOIN A
                ON A.ForeignKeyY=B.ID

这个例子毫无意义,但是应该解释一下语法。

对于不是“特殊”(索引、分区)的视图,这应该会产生与使用视图相同的查询计划。

为了使编写更容易,您可以验证每一段,以确保在编写整个查询之前得到了预期的结果。

如果这已经是你的旧帽子,我很抱歉。

票数 9
EN

Software Engineering用户

发布于 2012-04-16 06:40:08

不要使用临时视图,而是使用附条款。这使得将大型查询分解为更具可读性的更小的部分变得更加容易。

票数 8
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/144602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档