当前位置: 代码迷 >> Sql Server >> 二个字段,如若交叉相同,取一行,求SQL
  详细解决方案

二个字段,如若交叉相同,取一行,求SQL

热度:22   发布时间:2016-04-24 09:01:43.0
二个字段,如果交叉相同,取一行,求SQL
字段A,字段B
1,        2
2,        1

这二行只要一行。

SQL如何写
------解决思路----------------------
SELECT * FROM TB T1
WHERE NOT EXISTS(SELECT 1 FROM TB T2 WHERE T1.字段A=T2.字段B
AND T1.字段B=T2.字段A AND T1.字段A>T2.字段A)

------解决思路----------------------
引用:
SELECT * FROM TB T1
WHERE NOT EXISTS(SELECT 1 FROM TB T2 WHERE T1.字段A=T2.字段B
AND T1.字段B=T2.字段A AND T1.字段A>T2.字段A)


这个思路基本正确,不过要筛选这样的记录:
字段A,字段B
2,        2
2,        2
需要稍微修改下: T1.字段A >= T2.字段A

另外的做法,自连后去重:
;WITH cte(A,B) AS
(
 SELECT 1,2 UNION ALL
 SELECT 2,1 UNION ALL
 SELECT 2,1 UNION ALL
 SELECT 2,2 UNION ALL
 SELECT 2,1 UNION ALL
 SELECT 2,2 UNION ALL
 SELECT 2,2
)
SELECT DISTINCT *
FROM cte a INNER JOIN cte b ON a.A = b.B AND a.B = b.A AND a.A >= b.A

------解决思路----------------------
其实大概就可以了

如果要用JOIN,那样不存在交叉的数据也会过滤掉
------解决思路----------------------
@u010024618
我觉得如果是SQL2005,可以用开窗函数
;WITH CTE AS(
SELECT 字段A,字段B
,ROW_NUMBER()OVER(PARTITION BY
CASE WHEN 字段A>字段B THEN 字段A ELSE 字段B END
,CASE WHEN 字段A>字段B THEN 字段B ELSE 字段A END
ORDER BY 字段A)RN
FROM TB
)
SELECT 字段A,字段B FROM CTE WHERE RN=1

------解决思路----------------------

-- 借 楼上几位的数据 

;WITH cte(A,B) AS
(
 SELECT 1,2 UNION ALL
 SELECT 2,1 UNION ALL
 SELECT 2,1 UNION ALL
 SELECT 2,2 UNION ALL
 SELECT 2,1 UNION ALL
 SELECT 2,2 UNION ALL
 SELECT 2,2
)
select 
distinct 
case when A > B then A else B end A ,
case when A > B then B else A end B 
 from cte

A           B
----------- -----------
2           1
2           2

(2 行受影响)



  相关解决方案