删除具有交换列值的行

时间:2012-09-16 01:15:38

标签: sql view common-table-expression

我有一张像

这样的表格
+ ----------------------- +
| RowID | FromCol | toCol |
+ ----------------------- +
| 1     | a       | b     |
| 2     | b       | c     |
| 3     | c       | d     |
| 4     | c       | b     |
| 5     | b       | a     |
+ ----------------------- +

我想删除包含FromCol的行 - > ToCol与ToCol相同的值 - > FromCol 例如。 RowID 1是 - > b,RowID 5有b - > a所以rowID 5应该被删除。同样,RowID 4应该被删除,因为它有一个像RowID 2这样的交换值。

我的预期结果表是:

+ ----------------------- +
| RowID | FromCol | toCol |
+ ----------------------- +
| 1     | a       | b     |
| 2     | b       | c     |
| 3     | c       | d     |
+ ----------------------- +

我希望将此作为一个视图,最好使用CTE而不是使用SQL CURSOR。 请有人帮帮我。 感谢

4 个答案:

答案 0 :(得分:0)

这是在MySQL中实现它的一种方法,我不确定相同的语法是否适用于其他SQL方言。

DELETE t1
FROM mytable t1
INNER JOIN mytable t2
WHERE t1.fromCol = t2.toCol
AND t1.toCol = t1.fromCol
AND t1.rowID > t2.rowID

答案 1 :(得分:0)

与@Barmar非常相似,但使用子查询而不是内联表。

这适用于SQL Server

select t1.*
FROM dbo.MyTest t1
WHERE (SELECT COUNT(t2.rowid) 
         FROM dbo.MyTest t2 
        WHERE t2.toCol= t1.fromCol
          AND t2.fromCol= t1.toCol
          AND t1.rowid> t2.rowid) = 0

答案 2 :(得分:0)

请尝试

Delete from table where rowid in (select  f.id from table f INNER JOIN table fo on fo.tocol = f.fromcol and f.tocol = fo.fromcol and f.id > fo.id
)

答案 3 :(得分:0)

您可以使用如下所示的非常简单的 SQL:

SELECT RowID, FromCol, toCol
from my_table 
where FromCol > toCol

如果您的列有字符串,那么您可以使用一个简单的散列函数来获取针对它们的整数,然后对它们进行比较。