【发布时间】:2010-02-28 08:14:05
【问题描述】:
我有以下 SQL 表:
A|B
---
w|x
x|w
y|z
z|y
我可以构造一个查询,它会产生以下结果吗:
A|B
---
w|x
y|z
总而言之,我想将这两列视为无序集,这样 (a,b) == (b,a)。
【问题讨论】:
我有以下 SQL 表:
A|B
---
w|x
x|w
y|z
z|y
我可以构造一个查询,它会产生以下结果吗:
A|B
---
w|x
y|z
总而言之,我想将这两列视为无序集,这样 (a,b) == (b,a)。
【问题讨论】:
“最佳” 代码取决于数据库,但以下与 dbms 无关:
SELECT t.A,
t.B
FROM my_table t
LEFT JOIN my_table t2
ON t.A = t2.B
AND t.B = t2.A
AND t.A < t.B
WHERE t2.A IS NULL
【讨论】:
t.A > t.B 来获得指定的结果(w|x 而不是x|w)。
w<x 和y<z,但我知道什么:)
您可以尝试以下方法:
SELECT LEAST(a,b) a, GREATEST(a,b) b
FROM t
GROUP BY LEAST(a,b), GREATEST(a,b)
使用以下测试表t:
CREATE TABLE t ( a VARCHAR(1), b VARCHAR(1) );
INSERT INTO t VALUES ('w','x'),('x','w'),('y','z'),('z','y');
它返回:
w x
y z
使用LEAST 和GREATEST 还可以确保返回w x 而不是x w。
【讨论】:
least 和greatest。好的。 distinct 也不能在这里工作吗?
DISTINCT 在这种情况下会返回相同的结果。你必须测试性能,但我想它会是一样的。