0

我有一张像

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

我想删除 FromCol --> ToCol 与 ToCol --> FromCol 具有相同值的行,例如。RowID 1 是 a-->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

4 回答 4

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
于 2012-09-16T01:57:53.467 回答
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
于 2012-09-16T02:04:40.507 回答
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
)
于 2012-09-16T10:35:54.713 回答
0

你可以使用一个非常简单的 SQL,如下所示:

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

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

于 2021-02-23T15:18:28.213 回答