如果我有桌子:
id1 id2 count
A A 1
A B 2
A C 1
B A 3
B B 1
B C 2
C A 3
C B 2
C C 1
删除后我想要的内容:
id1 id2 count
A A 1
A B 2
A C 1
B B 1
B C 2
C C 1
这意味着我有A(id1) - > B(id2)然后删除B(id1) - > A(ID2)。与B(id1)相同 - > C(id2)然后删除行C(id1) - > B(ID2)
感谢您的帮助!
答案 0 :(得分:1)
应该是这样的:
DELETE FROM 'myTable'
WHERE STRCMP(id1, id2) > 0;
STRCMP
函数可以比较字符串并返回一个int。从那里它应该很容易 - 与上面非常相似的东西。如果您有进一步的麻烦,请告诉我。
答案 1 :(得分:1)
Target.id1 > Target.id2
这样的平均情况,例如(B, A, ??)
B > A
(A, A, ??)
left join
尝试使用(A, B, ??)
Source.id1 IS NOT NULL
,我们会删除<强> SQL Fiddle Demo 强>
DELETE Target
FROM Table1 Target
LEFT JOIN Table1 Source
ON Target.`id1` = Source.`id2`
AND Target.`id2` = Source.`id1`
AND Target.`id1` > Target.`id2`
WHERE Source.`id1` IS NOT NULL;
<强>输出强>
| id1 | id2 | count |
|-----|-----|-------|
| A | A | 1 |
| A | B | 2 |
| A | C | 1 |
| B | B | 1 |
| B | C | 2 |
| C | C | 1 |
答案 2 :(得分:1)
看起来你说的是......
如果表中有(id1,id2)元组,其值为例如(a,b),还有另一个元组(b,a)
由相同的值组成,但在列中交换,你想要删除其中一个元组。看起来您要删除的是第一列中具有“更大”值的那个。
首先,确定“重复”元组。
现在,我们将忽略id1和id2的值相同的元组,例如: (a,a)
。
SELECT s.id1
, s.id2
FROM mytable s
WHERE s.id1 > s.id2
AND EXISTS ( SELECT 1
FROM mytable r
WHERE r.id1 = s.id2
AND r.id2 = s.id1
)
ORDER BY s.id1, s.id2
如果返回要删除的行集,我们可以将其转换为DELETE。为此,我们需要将该查询更改为内联视图,
我们可以重写这个,确认我们得到相同的结果。
SELECT o.id1, o.id2
FROM ( SELECT q.id1, q.id2
FROM ( SELECT s.id1, s.id2
FROM mytable s
WHERE s.id1 > s.id2
AND EXISTS ( SELECT 1
FROM mytable r
WHERE r.id1 = s.id2
AND r.id2 = s.id1
)
) q
GROUP BY q.id1, q.id2
) p
JOIN mytable o
ON o.id1 = p.id1
AND o.id2 = p.id2
ORDER BY o.id1, o.id2
然后我们可以将其转换为DELETE语句,将SELECT o.id1, o.id2
替换为DELETE o.*
并删除ORDER BY ...
DELETE o.*
FROM ( SELECT q.id1, q.id2
FROM ( SELECT s.id1, s.id2
FROM mytable s
WHERE s.id1 > s.id2
AND EXISTS ( SELECT 1
FROM mytable r
WHERE r.id1 = s.id2
AND r.id2 = s.id1
)
) q
GROUP BY q.id1, q.id2
) p
JOIN mytable o
ON o.id1 = p.id1
AND o.id2 = p.id2