Sql 从结果中消除重复组合

Sql 从结果中消除重复组合,sql,sql-server,Sql,Sql Server,我有这样一个选择结果: from_loc | to_loc | ------------------------- A | B ------------------------ B | C ------------------------ B | A ------------------------ 如何从表中消除重复项,这意味着出现A到B,B到A意味着重复 我试图创造这样的结果,在尝试了几种方法后,我无法解决这个

我有这样一个选择结果:

from_loc    | to_loc   |
-------------------------
 A          |  B
------------------------
 B          |  C
------------------------
 B          |  A
------------------------  
如何从表中消除重复项,这意味着出现A到BB到A意味着重复

我试图创造这样的结果,在尝试了几种方法后,我无法解决这个问题

from_loc    | to_loc   |
-------------------------
 A          |  B
------------------------
 B          |  C
------------------------

有谁能给我一些提示或参考,我怎样才能达到这样的结果?

试试
DISTINCT
然后
不存在
,比如:

SELECT DISTINCT from_loc, to_loc
FROM TableName A
WHERE NOT EXISTS
(
  SELECT from_loc, to_loc
  FROM TableName B
  WHERE A.from_loc = B.to_loc
  AND A.to_loc = B.from_loc
 )
DISTINCT
将从\u-loc-->从\u-loc
到\u-loc-->到\u-loc

虽然
不存在
将消除从\u loc-->到\u loc
的重复
,以及从\u loc
到\u loc-->的重复
但我没有测试此解决方案,但它可以有更好的性能(逻辑读取更少):

DECLARE@MyTable表
(
from_loc VARCHAR(100)不为空,
to_loc VARCHAR(100)不为空
);
插入@MyTable(从_loc到_loc)值('A','B');
插入@MyTable(从_loc到_loc)值('B','C');
插入@MyTable(从_loc到_loc)值('B','A');
选择不同的src.from_loc_new,src.to_loc_new
从…起
(

当x.从_loc选择案例时,可能在
行编号中使用此
案例:

WITH CTE AS( 
  SELECT from_loc, to_loc, 
         rn = row_Number() Over (Partition By  CASE WHEN from_loc > to_loc
                                    Then to_loc + '|' + from_loc 
                                    Else from_loc + '|' + to_loc END
                                 Order By from_loc, to_loc)
  FROM dbo.TableName
)
SELECT from_loc, to_loc FROM cte WHERE rn = 1

假设您的原始SQL是:

SELECT from_loc, to_loc FROM route;
将其用作与
左连接
连接在一起的子查询两次。然后,使用
IF
清楚地选择所需字段

SELECT DISTINCT
  IF (y.from_loc IS NULL, x.from_loc,
    IF(x.from_loc < x.to_loc, x.from_loc, x.to_loc)) AS from_loc,
  IF (y.from_loc IS NULL, x.to_loc,
    IF(x.from_loc > x.to_loc, x.from_loc, x.to_loc)) AS to_loc
FROM (
) AS x
  SELECT from_loc, to_loc FROM route
LEFT JOIN (
  SELECT from_loc, to_loc FROM route
) AS y
ON x.from_loc = y.to_loc AND x.to_loc = y.from_loc;
在MySQL客户端应用程序上尝试以下操作:

SELECT DISTINCT
  IF (y.from_loc IS NULL, x.from_loc,
    IF(x.from_loc < x.to_loc, x.from_loc, x.to_loc)) AS from_loc,
  IF (y.from_loc IS NULL, x.to_loc,
    IF(x.from_loc > x.to_loc, x.from_loc, x.to_loc)) AS to_loc
FROM (
) AS x
  SELECT "A" AS from_loc, "B" AS to_loc
  UNION SELECT "B", "C"
  UNION SELECT "B", "A"
LEFT JOIN (
  SELECT "A" AS from_loc, "B" AS to_loc
  UNION SELECT "B", "C"
  UNION SELECT "B", "A"
) AS y
ON x.from_loc = y.to_loc AND x.to_loc = y.from_loc;
选择DISTINCT
如果(y.from_loc为空,x.from_loc,
如果(x.from_locx.到位置,x.从位置,x.到位置))关于位置
从(
)AS x
从位置选择“A”,从位置选择“B”
联合选择“B”、“C”
联合选择“B”、“A”
左连接(
从位置选择“A”,从位置选择“B”
联合选择“B”、“C”
联合选择“B”、“A”
)如同
在x上,从_loc=y.到_loc,x.到_loc=y.从_loc;

我知道这不是一个有效的解决方案,但它很有效!

发布您当前的SQL查询Hi Shai,我的查询非常大,为了让它更容易理解,我在这里放了一个非常简化的场景。谢谢!这将消除重复的两个副本,即删除
A | B
B | A
。这个问题需要一个保留这两行如果只有一个值为('D','C')的记录会发生什么?这个SQL会将其反转为('C','D'),对吗?这就是您想要的吗?@OchiWansa:2&3)是的。
SELECT "A" AS from_loc, "B" AS to_loc
UNION SELECT "B", "C"
UNION SELECT "B", "A";
SELECT DISTINCT
  IF (y.from_loc IS NULL, x.from_loc,
    IF(x.from_loc < x.to_loc, x.from_loc, x.to_loc)) AS from_loc,
  IF (y.from_loc IS NULL, x.to_loc,
    IF(x.from_loc > x.to_loc, x.from_loc, x.to_loc)) AS to_loc
FROM (
) AS x
  SELECT "A" AS from_loc, "B" AS to_loc
  UNION SELECT "B", "C"
  UNION SELECT "B", "A"
LEFT JOIN (
  SELECT "A" AS from_loc, "B" AS to_loc
  UNION SELECT "B", "C"
  UNION SELECT "B", "A"
) AS y
ON x.from_loc = y.to_loc AND x.to_loc = y.from_loc;