Sql 获得成对的单行

Sql 获得成对的单行,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)中,有正式

我在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)中,有正式的
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