我已经在这个问题上挣扎了很长一段时间,但我就是想不通。
我有一个有3列的表格。2列包含名称,第三列包含这些名称之间的Damerau Levensthein距离( http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance )。
每一列都包含每个名称,这意味着autor1列中的所有名称也会出现在autor2列中。结果,仅交换了autor1和autor2列,我就有了所需行的两倍。
例如,第3行等于第1行,只是交换了autor列,2-4也是如此。我该如何制定一个省略这些“重复项”的查询?
id-|-autor1-|-autor2-| dld
1古斯塔夫阿贝尔,古斯塔夫-|阿贝尔,古斯塔夫|1
2古斯塔夫阿贝尔,古斯塔夫-|阿贝尔,古斯塔夫|1
3古斯塔夫·阿贝尔( -| Abel )|阿贝尔,古斯塔夫--| 1
4阿贝尔,古斯塔夫|阿贝尔,古斯塔夫-| 1
至
|-autor1-|-autor2-| dld
| Abel,Gustav -| Abel,Gustave |1
| Abel,Gustav -| Abele,Gustav |1
发布于 2012-05-07 20:31:16
使用NOT EXISTS可以在我所知道的所有数据库管理系统上运行。这样做的复杂性在于不要忘记包含一个关于id的子句。如果没有它,将不会返回任何内容。
SELECT *
FROM YourTable yto
WHERE NOT EXISTS (
SELECT *
FROM YourTable yti
WHERE yti.autor2 = yto.autor1
AND yti.id > yto.id
)编辑
下面是语句背后的逻辑的逐步分解
获取第一条记录(ID = 1)
ID > 1和autor1 = autor2 (是,ID 3)和下一条记录-> ID > 2 (ID = 2)
autor1 = autor2(是,ID 3)和->ID > 2(是,ID 4) the next record (ID = 3)
ID > 3 Ignore
autor1 = autor2 (No) -> -> next record (ID = 4)
ID > 4 ID > 3autor1 = autor2 (No) there a record whereID > 4ID > 3autor1 = autor2(No) -> next record->there a record whereID > 4ID > 3autor1 = autor2(No)->next record->there a record whereID > 4ID > 3autor1 = autor2(No)->next record->there a record whereID > 4ID > 3autor1 = autor2(No)->next record whereID > 4 autor1 = autor2 (No)->recordhttps://stackoverflow.com/questions/10482107
复制相似问题