如何将这2个查询合并,只查询一次

问题描述

第一个sqlSELECT COUNT(0),user_id,onlinekf_get_customer_name(user_id) customerName FROM(SELECT COUNT(0),user_id FROM BUSINESS_CHAT_MSG T WHERE T.USER_ID IN (SELECT ID FROM BASE_CUSTOMER_INFO T WHERE COMPANY_ID = 'e4510180373c41a09a87b1f768a9b660') AND chat_time>=to_date('2014-04-01 00:00:00','yyyy-MM-dd hh24:mi:ss') AND chat_time<=to_date('2014-04-25 23:59:59','yyyy-MM-dd hh24:mi:ss') GROUP BY user_id,t.chat_basic_id) GROUP BY user_id第二个sqlSELECT COUNT(0),user_id,onlinekf_get_customer_name(user_id) customerName FROM(SELECT COUNT(0) vc,user_id,chat_basic_id FROM BUSINESS_CHAT_MSG T WHERE T.USER_ID IN (SELECT ID FROM BASE_CUSTOMER_INFO T WHERE COMPANY_ID = 'e4510180373c41a09a87b1f768a9b660') AND sendrole_type='0' AND chat_time>=to_date('2014-04-01 00:00:00','yyyy-MM-dd hh24:mi:ss') AND chat_time<=to_date('2014-04-25 23:59:59','yyyy-MM-dd hh24:mi:ss') GROUP BY user_id,t.chat_basic_id) GROUP BY user_id两个sql唯一的区别是其中有个条件不同,但却要查询2次,能否合并成一个,只查询一次,不能通过union,union还是查了2次 问题补充:第一个sql count算的是 对话数量,第二个sql count 算的是 有效对话数量,显示的时候要分2列,显示在一条记录里(对话数量 有效对话数量),不是把他们合并,放在一列里

解决方案

select a.user_id,onlinekf_get_customer_name(user_id) customerName ,count(1) 对话数量,sum(decode(b.sendrole_type,'0',1,0)) 有效对话数量from BUSINESS_CHAT_MSG a,BASE_CUSTOMER_INFO bwhere a.user_id = b.idand b.COMPANY_ID = 'e4510180373c41a09a87b1f768a9b660') AND b.chat_time>=to_date('2014-04-01 00:00:00','yyyy-MM-dd hh24:mi:ss') AND b.chat_time<=to_date('2014-04-25 23:59:59','yyyy-MM-dd hh24:mi:ss') 大概意思就是两表关联,直接count计算的就是对话数量,加了decode判断的就是有效对话数量因为你没给表结构,所以可能直接运行不一定能用,你自己再改改
解决方案二:
SELECT COUNT(0) vc,user_id,chat_basic_id,count(decode(tt.sendrole_type,'0',tt.sendrole_type)FROM BUSINESS_CHAT_MSG T ,(SELECT ID as user_id ,sendrole_type as sendrole_type FROM BASE_CUSTOMER_INFO T WHERE COMPANY_ID = 'e4510180373c41a09a87b1f768a9b660') AND chat_time>=to_date('2014-04-01 00:00:00','yyyy-MM-dd hh24:mi:ss') AND chat_time<=to_date('2014-04-25 23:59:59','yyyy-MM-dd hh24:mi:ss') GROUP BY user_id,t.chat_basic_id,sendrole_type) ttwhere t.USER_ID = tt.user_id group by t.user_id,chat_basic_id你给的语句有问题,group by现实两个字段,但group by 后面只给一个,而且外层最终结束括号也没有。
解决方案三:
如果是oracle 可以考虑用with as如:WITH qb1 AS (SELECT inst_id FROM gv$session), qb2 AS (SELECT unique inst_id FROM qb1 UNION ALL SELECT unique inst_id FROM qb1)SELECT /*+ MATERIALIZE */ *FROM qb1, qb2WHERE qb1.inst_id = qb2.inst_id;
解决方案四:
WHERE (COMPANY_ID = 'e4510180373c41a09a87b1f768a9b660' or (COMPANY_ID = 'e4510180373c41a09a87b1f768a9b660' AND sendrole_type='0' )) 不可以么?

时间: 2025-01-02 06:02:51

如何将这2个查询合并,只查询一次的相关文章

Access 2007使用联合查询合并多个选择查询的结果

对于多个相似的选择查询,当您希望将它们返回的所有数据一起作为一个合并的集合查看时,便可以使用联合查询 本文将向您介绍如何根据两个或多个现有的选择查询创建联合查询,同时说明如何使用结构化查询语言 (SQL) 编写联合查询 为完成本文中的示例,您应该对如何创建和运行选择查询有基本的了解.有关如何创建选择查询的详细信息,请参阅请参阅部分中的链接 本文内容 联合查询基础知识联合查询有哪些功能? 联合查询可合并多个相似的选择查询的结果集 例如,假设您有两个表,一个用于存储有关客户的信息,另一个用于存储有关

多个表格查询合并至单一声明的常用方式

在对跨多个表格的数据进行组合时,有时很难搞清楚要使用哪一个SQL句法.我将在这里对将多个表格中的查询合并至单一声明中的常用方式进行阐述. 在这篇文章中的样本查询符合SQL92 ISO标准.不是所有的数据库生产商都遵循这项标准,而且很多厂商采取的提升措施会带来一些意料不到的后果.如果你不确定你的数据库是不是支持这些标准,你可以参看生产厂商的有关资料. SELECT 一个简单的SELECT声明就是查询多个表格的最基本的方式.你可以在FROM子句中调用多个表格来组合来自多个表格的结果.这里是一个它如何

link发射属性的时候如何排除一些不要的属性,只查询其中一部分,用数组定义的属性可以么?

问题描述 link发射属性的时候如何排除一些不要的属性,只查询其中一部分,用数组定义的属性可以么? link发射属性的时候如何排除一些不要的属性,只查询其中一部分,用数组定义的属性可以么? 解决方案 string[] excludes = { xxx, xxx, ... }; //不需要的属性 PropertyInfo[] props = typeof(T).GetPropertites(x => !excludes.Contains(x.Name)).ToArray(); ...

select-求各位大神看一下,运行时查询结果只显示一行

问题描述 求各位大神看一下,运行时查询结果只显示一行 protected void wbtn_find_Click(object sender, EventArgs e) { string where = ""; string text = Textname.Text; for (int i = 0; i < text.Length; i++) { string ss = text.Substring(0, 1); where += "(District_Name LI

mysql的查询、子查询及连接查询

一.mysql查询的五种子句         where(条件查询).having(筛选).group by(分组).order by(排序).limit(限制结果数)           1.where常用运算符:             比较运算符                 > ,  < ,=  , != (< >),>=   ,   <=                   in(v1,v2..vn)                   between v1

Lucene5学习之多索引目录查询以及多线程查询

   上一篇中我们使用多线程创建了索引,下面我们来试着采用不把多个索引目录里的数据合并到一个新的索引目录的方式去查询索引数据,当然你也可以合并(合并到一个索引目录查询就很简单了),其实很多情况我们都是不合并到一个索引目录的,那多索引目录该如何查询呢,在Lucene5中使用的MultiReader类,在Lucene4时代,使用的是MultiSearcher类.至于Lucene多线程查询,只需要在构建IndexSearcher对象时传入一个ExecutorService线程池管理对象即可,具体请看下

详解MySql基本查询、连接查询、子查询、正则表达查询_Mysql

查询数据指从数据库中获取所需要的数据.查询数据是数据库操作中最常用,也是最重要的操作.用户可以根据自己对数据的需求,使用不同的查询方式.通过不同的查询方式,可以获得不同的数据.MySQL中是使用SELECT语句来查询数据的.在这一章中将讲解的内容包括. 1.查询语句的基本语法 2.在单表上查询数据 3.使用聚合函数查询数据 4.多表上联合查询 5.子查询 6.合并查询结果 7.为表和字段取别名 8.使用正则表达式查询 什么是查询? 怎么查的? 数据的准备如下: create table STUD

性能优化之查询转换 - 子查询类

子查询,是SQL中常见的一种写法.对于优化器来说,子查询是较难优化的部分.Oracle提供了多种方式,对子查询进行查询转换. 一.子查询推进 子查询推进(又称子查询推入)是指优化器将子查询提前进行评估,使得优化器可以更早地介入优化以获得更优质的执行计划.这个技术可以通过提示PUSH_SUBQ/NO_PUSH_SUBQ控制.下面通过一个示例看看结果. SQL> create table t_users as select * from dba_users; //表已创建 SQL> create

解析mysql的查询、子查询及连接查询教程

一.mysql查询的五种子句         where(条件查询).having(筛选).group by(分组).order by(排序).limit(限制结果数)           1.where常用运算符:             比较运算符                 > ,  < ,=  , != (< >),>=   ,   <=                  in(v1,v2..vn)                  between v1 a