所以我有一张看起来像这样的表:
[sides]
--------------------
left | right
A | B
A | C
A | D
B | A
--------------------
请注意,第一行和最后一行是相同的值对。我需要做的是将所有唯一对插入另一个表,在上表执行后看起来像这样:
[pairs]
------------------
val1 | val2
A | B
A | C
A | D
------------------
到目前为止,我有这段代码:
INSERT INTO pairs (val1, val2)
SELECT DISTINCT s1.left, s1.right
FROM sides s1;
正如你所看到的那样,它只复制了对,但不能解决我的问题。
答案 0 :(得分:1)
使用least()
和greatest()
:
INSERT INTO pairs(val1, val2)
SELECT DISTINCT least(s1.left, s1.right), greatest(s1.left, s1.right)
FROM sides s1;
编辑:
以上内容应该有效(您可以单独测试select
)。你也可以这样做:
INSERT INTO pairs(val1, val2)
SELECT s1.left, s1.right
FROM sides s1
WHERE s1.left < s1.right
union all
SELECT s1.left, s1.right
FROM sides s1
WHERE s1.left > s1.right and
not exists (select 1
from sides s2
where s1.left = s2.right and s1.right = s2.left
);
此版本可以利用sides(left, right)
上的索引。