`
lienhe
  • 浏览: 5647 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

今天遇到的sql去重和查询问题

阅读更多

今天遇到了一点sql语句的问题,在这里做一下笔记。

------------

今天上午在调试程序的时候突然web页面突然挂了,查看后台提示发现为“单行查询返回多个行”,典型的有地方在查唯一值的时候出错了,结果查看sql果然有查唯一值的地方,这里sql形如:

select a,b,(select c from table1 where ..) c from table2.. where..

查询c的时候出现了多值。因为是之前的sql并且一直都没有问题,经过查表分析数据,果然发现是本次需求的改动引起。当然,首先表的设计就不太合理,table2的主键为两个字段key1,key2,而与table1对应的居然只有key1,而在根据需求改动的时候出现了key1同,key2不同的数据,而改动的地方在table1中居然没有体现!当然这不是重点,表中数据已经太多了,我们不能随便改动表,只能想别的方式。

找到问题所在,直觉反应就是加上distinct,想了一下应该没错,就改好sql在库中首先测一下,sql如下

select a,b,(select distinct c from table1 where ..) c from table2.. where..

问题来了,本来执行本条sql只需要4、5秒钟,结果这次执行了将近十分钟才执行完,如果不是我在执行的时候又检查了一遍sql发现没错,我都要直接停掉了。在执行期间上网查了一下,原来distinct需要排序然后才能去重,数据量小的时候没有什么影响,一旦数据量大了,就非常影响性能。没有什么太好的办法,只能用了一个取巧的办法, 因为查出来的c如果有重值的话都是相同的,所以就直接取第一行数据,sql如下:

select a,b,(select c from table1 where .. and rownum=1) c from table2.. where ..

改好测试,发现跟原来执行效率差不多,暂时就这样了。但是这里刚好能够取巧,如果多值不同的话distinct绕不过了,不知道有没有办法解决这个问题。不得不吐槽一下,表的设计太不合理了。

ps:这里要用这种查询方式的原因是需要table1中的c字段,而由于table1表太大,不想联查,只有在前端页面选择某项时才联查,这样在sqlmap中,用<isGreaterEqual>加table1 t,而c字段又不能直接写t.c,只能用以上sql重新查一下了。

-------

还有另外一个问题要吐槽一下,新需求要把web页面的某个查询条件从两种细分成5种,本来表中只用0和1表示,其他状态只能联查其他表,这个还好说,无非where语句里面细分,但是要在选择web页面选择全部的时候在list页面也要体现,这样只能在select里面用case when再查一遍了,这样直接加了四个查询,这样整个sql变的很臃肿,很担心以后再有新需求改动这里的时候其他人能不能看懂啊。

0
0
分享到:
评论

相关推荐

    sql_按照某一个字段进行去重后获取全部字段

    通过以上分析,我们不仅了解了 SQL 去重的基本概念,还深入学习了一种较为复杂的去重方式——结合 EXISTS 子查询和 GROUP BY 语句。这种组合方式在实际应用中非常有用,特别是在需要处理大量数据并且需要精确控制...

    在SQL中删除重复记录多种方法

    本文将介绍几种有效的方法,以帮助你在遇到重复记录问题时能有效地清理数据。我们将以Oracle数据库为例,但这些方法在其他SQL数据库系统中也具有一定的通用性。 首先,让我们通过一个简单的例子来理解问题。假设...

    sql 查询慢的48个原因分析.txt

    当遇到SQL查询缓慢的情况时,可能由多种复杂的原因导致。根据提供的文件标题、描述和部分内容,我们可以深入探讨这48个可能导致SQL查询速度减缓的因素,并提供相应的解决策略。 ### 1. 缺乏或不恰当的索引 索引是...

    SQL查询语句精华.txt

    ### SQL查询语句精华知识点详解 #### 一、基本查询语句 在SQL语言中,基本的查询操作主要通过`SELECT`语句实现。通过不同的条件组合,可以满足各种复杂的数据检索需求。 **1. 选择列:** - **语法格式:** `...

    SQL常见错误.txt

    在处理SQL查询时,可能会遇到关于`text`、`ntext`和`image`数据类型的错误提示。这些数据类型主要用于存储大量的文本或图像数据,在某些情况下,比如进行比较操作或者排序时,会受到限制。本文将详细介绍如何解决与...

    sql面试经典常见问题

    在SQL面试中,掌握经典问题至关重要,因为这些问题涵盖了SQL的基础知识和高级特性的应用。以下是一些面试中可能会遇到的SQL题目及其解析: 1. **查询每门课都大于80分的学生姓名** 这个问题涉及到子查询和聚合函数...

    一条sql语句完成MySQL去重留一

    总结来说,处理MySQL中的重复数据时,可以使用`DISTINCT`关键字来获取去重后的结果,但若要直接删除重复数据,需要采用更复杂的SQL语句,如上述示例中的`JOIN`和`GROUP BY`配合`HAVING`子句。在实际操作中,应根据...

    SQL-database-extractor-module.rar_SQL13824_database

    DistillSQL可能负责解析和优化SQL查询,提升查询效率,或者对导出的数据进行预处理,比如去重、清洗、转换等,以满足特定的分析需求。 综合来看,这个压缩包提供了一个用于处理SQL数据库的工具,配合详细的使用说明...

    MySQL去重的方法整理

    MySQL数据库在处理数据时,有时会遇到重复记录的问题,这会影响数据的准确性和一致性。本文将详细介绍MySQL中去除重复记录的几种方法,从初级到高级,适用于不同复杂度的场景。 **初级方法:DISTINCT查询与手动删除...

    oracle的sql优化

    Oracle的SQL优化是数据库管理中的关键任务,它旨在提高查询速度、降低资源消耗,从而提升整个系统的性能。以下是一些重要的优化策略: 1. **全表扫描与索引扫描**: - 全表扫描应尽量避免,尤其对于大数据量的表,...

    C#中datatable去重的方法

    在C#编程中,处理数据时经常会遇到需要去除DataTable中重复数据的情况。DataTable是一种常见的数据存储结构,它允许程序员在不直接与数据库交互的情况下处理数据。以下将详细介绍两种在C#中实现DataTable去重的方法...

    SQL中遇到多条相同内容只取一条的最简单实现方法

    在SQL查询中,有时我们需要处理重复的数据,特别是当表中存在多条内容几乎相同但有细微差异的记录时。这种情况通常发生在数据导入错误或者业务逻辑导致的冗余数据上。本文将详细介绍如何在SQL中以最简单的方式选取...

    PL/SQL方面的好书

    ### PL/SQL 方面的好书知识点总结 #### 核心知识点概述 - **SQL与PL/SQL基础**:包括SQL语言的基本...此外,本文还特别强调了联接查询的重要性以及处理重复数据的有效方法,这些都是在实际项目中经常会遇到的问题。

    Oracle的sql语句练习题及参考答案

    Oracle SQL是用于管理和操作Oracle数据库的强大工具,它允许用户查询、更新、插入和删除数据,以及执行复杂的数据库操作。在“Oracle的SQL语句练习题及参考答案”中,我们很可能会遇到各种与`SELECT`语句相关的练习...

    mysql 开发技巧之JOIN 更新和数据查重/去重

    在实际开发中,JOIN更新和数据查重/去重是经常遇到的问题。理解并熟练运用这些技巧,能够提高数据库管理的效率,保证数据的一致性和准确性。希望本文的介绍能对你在MySQL开发中遇到类似问题时提供帮助。

    sql执行过程.zip

    理解这个过程对于数据库管理员和开发人员优化查询性能、解决查询问题以及设计高效的数据访问策略至关重要。通过深入学习和理解这些步骤,我们可以更好地利用MySQL和其他数据库系统提供的功能,提升应用的性能和用户...

    Java程序员在写SQL程序时候常犯的10个错误_.docx

    Java程序员在编写SQL程序时,由于SQL语言的特性和与Java的差异,常常会遇到一些常见错误。以下是对这些错误的详细分析和解决方案: 1. 忘记处理NULL值 NULL在SQL中的处理方式与Java中不同,容易引发混淆。Java中的...

    sql利用union all行转列

    ### SQL利用UNION ALL进行行转列方法解析 ...这种方法虽然简单明了,但在实际应用中可能会遇到性能问题,尤其是在处理大量数据时。因此,在实际工作中还需要根据具体情况选择合适的工具和技术来优化查询效率。

    两个表中查询出不同的数据

    本话题聚焦于如何从两个表中查询出不同的数据,这是一个在数据对比、数据清洗和数据分析时经常遇到的问题。通过理解并掌握这个技能,可以有效地找出数据间的差异,从而提升数据处理的准确性和效率。 首先,我们要...

    sql的优化初级版

    虽然这些SQL查询在Oracle中经过解析后的执行效果相同,但从Oracle的共享内存SGA的角度来看,相同的SQL查询应尽可能保持一致的写法,以减少重复的分析和内存占用。 **2. WHERE后面的条件顺序影响** - **示例**:...

Global site tag (gtag.js) - Google Analytics