我发现编写复杂的SQL查询非常困难,这些查询涉及多个表(至少3-4个)的联接,并涉及多个嵌套条件。要求我编写的查询很容易用几句话来描述,但可能需要大量欺骗性的代码才能完成。我发现自己经常使用临时视图来编写这些查询,这似乎有点麻烦。您可以提供哪些技巧,使这些复杂的查询更容易使用?更具体地说,如何将这些查询分解为实际编写SQL代码所需的步骤?
请注意,要求我编写的SQL是数据库课程作业的一部分,所以我不想要为我做这项工作的软件。我想真正理解我正在写的代码。
更多技术细节:
发布于 2012-04-16 14:58:43
我的大部分工作都是基于试图得到“正确”的答案,所以你可能会发现这里有一些性能问题。没有必要加速不正确的查询。
理解表中的关系--大多数都是一对多的。知道“很多”的桌子。标识连接所需的字段。
想一想左边的加入方案--从上个月开始选择所有员工和他们的薪水。如果他们上个月没拿到薪水怎么办?
了解结果集: 1)在电子表格中,手动为查询输入至少一条正确的记录。2)以足够简单的形式编写查询,以确定应该返回多少条记录。使用这两种方法来测试您的查询,以确保加入一个新表不会改变结果。
将查询分解为可管理的部分--不必一次全部编写。复杂查询有时只是简单查询的集合。
注意混合级别的聚合:如果您必须将每月、季度和年度的值放在相同的结果集中,则需要在对不同值分组的查询中分别计算它们。
知道何时联合,有时更容易将子组划分为他们自己的select语句。如果您有一个与经理和其他员工混合的表,并且在每一列上都必须根据其中一个组的成员身份执行Case语句,那么编写Manager查询和工会到员工查询可能会更容易。每个人都有自己的逻辑。显然,必须将来自不同表的项包含在不同的行中。
复杂/嵌套公式--尝试连续缩进,不要害怕使用多行。“以防万一”会把你逼疯的。花点时间把这些想清楚。把复杂的电脑留到最后。首先获取所选的正确记录。然后,在使用正确的值时,攻击复杂的公式。查看公式中使用的值将帮助您发现必须计算空值的区域,以及处理零错误除法的位置。
在添加新表时经常进行测试,以确保仍然得到所需的结果集,并知道哪个联接或子句是罪魁祸首。
发布于 2012-04-16 17:36:59
这里有点模糊,但是如果您正在编写大量临时视图,也许您还没有意识到大多数地方您可以在SQL语句中放置一个表,这个表可以用一个查询来替换。
因此,与其将表A连接到临时视图B,不如将表A加入到作为临时视图B使用的查询中,例如:
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这个例子毫无意义,但是应该解释一下语法。
对于不是“特殊”(索引、分区)的视图,这应该会产生与使用视图相同的查询计划。
为了使编写更容易,您可以验证每一段,以确保在编写整个查询之前得到了预期的结果。
如果这已经是你的旧帽子,我很抱歉。
发布于 2012-04-16 06:40:08
不要使用临时视图,而是使用附条款。这使得将大型查询分解为更具可读性的更小的部分变得更加容易。
https://softwareengineering.stackexchange.com/questions/144602
复制相似问题