寻找数据表中一列相同并且存在另一列有不同值的记录

假如我有一张表  T  其中有两列 ,如下图所示:

A B
1 3
1 3
2 5
2 4
3 7
3 7
   

其中,A列值为1的对应B列的值都为3,A列值为为2对应B列的值有两个,一个是5,一个是4,我们的目的就是列出  2  5,2 4 这两条记录。

第一种方法,巧妙的采用了max 和min函数,当我们使用A列分组后,如果 max(B)=min(B),那么B列的所有值肯定是相同的。反之则是我们需要寻找的记录。SQ如下:

select * from T where T.A in
     (select Ti.A from T Ti group by Ti.A having max(Ti.B)<>min(Ti.B))

也可以采用另一种写法

select * from T where T.A in
     (select Ti.A from (select distinct A,B from T) Ti group by Ti.A
       having count(Ti.B)>1

上面的写法先去除A,B当中重复的列,然后根据A列分组,计算B列不同值的个数,此方法相比较上面一种增加了一个select,复杂了一些!

不够发现可以把内部的select 去掉,简化版如下:

select * from T where T.A in
     (select Ti.A from  Ti group by Ti.A
       having count(distinct Ti.B)>1
时间: 2024-10-15 14:13:38

寻找数据表中一列相同并且存在另一列有不同值的记录的相关文章

获取数据表中列的描述值

原文:获取数据表中列的描述值 前面有写过<MS SQL为字段添加说明>https://www.cnblogs.com/insus/p/12106589.html 现如今,我们获取这些字段的描述值. 先来看一句SELECT语句: SELECT * FROM sys.extended_properties GO Source Code 如上SQL语句,虽然得到描述的值,但我们不清楚是哪一张表,和哪一个字段的说明. 因此,得使用系统另外对象来关联查询: SELECT t.[name] AS [Tab

对数据表中某2列的值对调

原文:对数据表中某2列的值对调 如标题所言,需要把2列的数据进行对调,列1的值存入列2,把列2的值存储列1中去. 如何实现,2种方法: 第1种,对列名进行修改,把name1改为name2,把name2改为name1即可: sp_rename 'Q3.name1',temp_name1,'column' GO sp_rename 'Q3.name2',temp_name2,'column' GO sp_rename 'Q3.temp_name1',name2,'column' GO sp_rena

c#用NPOI将excel文件内容读取到datatable数据表中

将excel文件内容读取到datatable数据表中,支持97-2003和2007两种版本的excel 1.第一种是根据excel文件路径读取excel并返回datatable 1 /// <summary> 2 /// 将excel文件内容读取到DataTable数据表中 3 /// </summary> 4 /// <param name="fileName">文件完整路径名</param> 5 /// <param name=

MySQL查询数据表中数据记录(包括多表查询)

MySQL查询数据表中数据记录(包括多表查询) MySQL查询数据表中数据记录(包括多表查询) 转自:http://www.baike369.com/content/?id=5355 在MySQL中创建数据库的目的是为了使用其中的数据. 使用select查询语句可以从数据库中把数据查询出来. select语句的语法格式如下: select selection_list // 要查询的内容,选择哪些列 from table_list // 从什么表中查询,从何处选择行 where primary_

默认情况下,不使用of子句表示在select所有的数据表中加锁(转)

Select …forupdate语句是我们经常使用手工加锁语句.通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作.同时,在多版本一致读机制的支持下,select语句也不会被其他类型语句所阻碍. 借助for update子句,我们可以在应用程序的层面手工实现数据加锁保护操作.本篇我们就来介绍一下这个子句的用法和功能. 下面是采自Oracle官方文档<SQLLanguage Reference>中关于for update子句的说明:(请双击点开图片查看) 从for

Sql Server 在已知表中插入、删除、修改某一列操作

--1.向已有表中增加一列 ALTER TABLE TableName ADD ColumnName VARCHAR(20) NULL --2.删除表中的某一列 ALTER TABLE TableName DROP COLUMN ColumnName --3.修改某一列的数据类型 ALTER TABLE TableName ALTER COLUMN ColumnName INT 2.查询当年或者当月的数据 1.查询当年的数据 SELECT * FROM UserInfo WHERE YEAR(R

SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型

原文:SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.熟悉或了解Microsoft SQL Server 2008中的空间数据类型. 4.具备相应(比如OGC)的GIS专业理论知识. 5.其他相关知识. 通过前面几篇文章介绍了

Excel数据表中的金额由“元”转换为“万元”的方法

Excel数据表中的金额由"元"转换为"万元"的方法 2012-05-23 09:33:16|  分类: Office操作 |  标签:excel技巧  |举报|字号 订阅 有下列Excel数据表,金额栏的单位为"元",为简便起见,需将金额单位由"元"转换为"万元". 方法如下: 1.在任意单元格(如D2)输入"10000",并点击"复制"按钮: 2.选定拟转换为万元

通过 JDBC 向指定的数据表中插入一条记录,查询记录

//通过 JDBC 向指定的数据表中插入一条记录 /*  * 1.Statement: 用于执行SQl语句的对象  *  通过Connection 的createStatement()方法来获取  *  通过executeUptate(sql) 可执行sql语句  *  传入的sql 可以是 insert , update, delete 但不能是select  * 2.Connection 和 Statement 需要关闭  *  需要在finally中关闭  * 3.关闭的顺序:先关闭后获取