Sql 获得成对的单行
我在MS SQL Server数据库中有一些数据。样本数据为: Sl 圆柱 专栏B 1. 111 112 2. 112 111 3. 113 114 4. 114 113 5. 115 116 6. 116 115Sql 获得成对的单行,sql,sql-server,Sql,Sql Server,我在MS SQL Server数据库中有一些数据。样本数据为: Sl 圆柱 专栏B 1. 111 112 2. 112 111 3. 113 114 4. 114 113 5. 115 116 6. 116 115 一种方法是使用CASE表达式来查找每个记录中的最小/最大值: 选择DISTINCT 当ColumnA=ColumnB时,则ColumnA ELSE ColumnB结束为ColumnB 从你的桌子上 1号订单; 请注意,在某些其他数据库(如MySQL和Postgres)中,有正式
一种方法是使用
CASE
表达式来查找每个记录中的最小/最大值:
选择DISTINCT
当ColumnA=ColumnB时,则ColumnA ELSE ColumnB结束为ColumnB
从你的桌子上
1号订单;
请注意,在某些其他数据库(如MySQL和Postgres)中,有正式的
LEAST
和magest
函数,它们可以简化和消除上面使用的庞大的CASE
表达式的需要。如果所有行都有反向对,则可以简单地使用:
select columnA, columnB
from t
where columnA < columnB;
在大多数情况下,这两种方法的性能都应该优于聚合或选择不同的方法。OP在评论中告诉我们,实际上他只想消除表中的重复数据 所以我很确定,上面提到的这个问题只是一个潜在问题的症状,我会建议一个完全不同的方法 要解决这个问题,我会 1.)快速修复:之前已经解决了此问题-在插入时,将较低的值放入字段A。这样您就不会有此类重复项。或者更好:使用第二列的id(AI)、SI和Value字段。对于一个特定SID,则有两条记录—一条记录为111,另一条记录为112 2.)专业方法-正确规范化: 创建两个表 表1
SI and all other fields
表2
id (AI) | SI (not UNIQUE) | value
对于表1中的每个值SI,表2中有n条(例如2条,但可以是n条)记录
e、 g.对于SID,您将有2条记录
id SID值
{id}3 113{id}3 114
这对各种SQl查询有很大帮助,因为您有更好的结构。每个SID(0-n)可以有任意多个值,而无需每次更改表结构以符合列AAZ;-) 嗨!我确实理解第一个例子,但第三行对我来说不清楚,因为没有满足像SI(5)(A)=SI(6)(B)和&SI(5)(B)=SI(6)(A)这样的条件???这是数据中的错误还是解释遗漏了什么?好的,这是数据错误。我看见你修好了。第二个问题:第二个表有两行A列-这不应该是B列吗?如果每一行都以奇数/偶数方式与下一行配对,您只需执行
,其中si%2=0
(A)111(B)112与(A)112(B)111相同,您只需删除重复项即可那么您就有了一个数据规范化问题。@AlexanderDobernig是的,我想删除duplicates@AminurRahman ??? 我不知道这个评论是什么意思。您是否打算将其置于问题之下?顺便问一句:您是否知道用于消除一对多关系的操作程序保存在一个表中?
id (AI) | SI (not UNIQUE) | value