19

假设查询结果应该返回字符串对 (x, y) 的列表。我正在尝试消除反向重复。我的意思是,如果 (x, y) 是结果之一,则 (y, x) 不应稍后出现。

例子:

column 1 (foreign key)    column 2 (int)     column 3 (string)
4                         50                 Bob
2                         70                 Steve 
3                         50                 Joe

此表中表示的人员可以多次出现,并具有不同的第 2 列值。

我的查询需要打印每对具有相同第 2 列值的名称:

select e.column3, f.column3 from example as e, example as f where e.column2 = f.column2 

(Bob, Bob)
(Bob, Joe)
(Joe, Bob)
(Joe, Joe)

我升级了查询,以便它删除双打:

select e.column3, f.column3 from example as e, example as f where e.column2 = f.column2
       and e.column3 <> f.column3

(Bob, Joe)
(Joe, Bob)

现在我希望它只返回:

(Bob, Joe). 

(Joe, Bob) 是反向复制的,所以我不希望它出现在结果中。有没有办法在一个查询中处理它?

4

2 回答 2

32

首先,欢迎来到 2012。我们已经不再使用逗号关联表。它是在 ANSI 89 中引入的,但严重缺乏。现在,正确的方法是使用 ANSI 92/99/2003 JOIN 语法编写查询。

您的问题的解决方案是将您的双向不等式<>变成单向不等式,无论<>喜欢哪种方式。

select e.column3, f.column3
from example as e
join example as f on e.column2 = f.column2 and e.column3 < f.column3
于 2012-10-24T01:41:17.703 回答
1
select e.column3, f.column3 from example as e, example as f where e.column2 = f.column2
       and e.column3 <> f.column3 where e.id < f.id

添加一个简单的 where 子句应该可以做到。

于 2012-10-24T01:40:16.360 回答