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到B,B到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;