如何在不使用查询中的distinct的情况下获得相同的结果

时间:2011-08-16 20:23:50

标签: sql distinct

我有一个包含数据的表:

[ID, Name]
1, Bob
1, Joe
1, Joe
1, Bob

我想检索一个记录列表,显示具有相同ID的记录之间的关系。 例如,我想从我的查询中得到以下结果集:

Bob, Joe
Joe, Bob
Bob, Bob
Joe, Joe

这显示了表中每个项目的“from”和“to”。

我可以使用以下查询获得此结果:

SELECT DISTINCT [NAME] 
FROM TABLE A
INNER JOIN TABLE B ON A.ID = B.ID

对我来说,如果没有在select语句中使用“distinct”来实现相同的结果集吗?如果我不包括distinct,我会得到16条记录,而不是4条记录。

4 个答案:

答案 0 :(得分:5)

在没有DISTINCT的情况下获得重复行的原因是因为ID = x的每一行都将与ID = x的每一行连接。由于原始表具有(1,“Bob”)两次,因此这两个表将连接到另一个表中ID = 1的每一行。

在执行连接之前删除重复项将执行以下两项操作:减少运行查询的时间,并防止重复行显示在结果中。

类似(使用MySQL版本的SQL):

SELECT L.NAME, R.NAME
FROM (SELECT DISTINCT ID, NAME FROM A) AS L
INNER JOIN (SELECT DISTINCT ID, NAME FROM B) AS R
ON L.ID = R.ID

编辑:B是表A的别名吗?

答案 1 :(得分:4)

在SQL和MY SQL中

SELECT COLUMN_NAME FROM TABLE_NAME group by COLUMN_NAME

答案 2 :(得分:0)

您是否尝试过使用group by条款?

select name
from table a
inner join table b
on a.id=b.id
group by name

这应该与上面的distinct查询相同。至于你想要的结果集,一个简单的自连接应该这样做:

select name1,name2
from(
  select id,name as name1
  from table
  group by 1,2
  )a
join(
  select id,name as name2
  from table
  group by 1,2
  )b
using(id)

答案 3 :(得分:-1)

使用union消除重复值而不使用不同的

Declare @TableWithDuplicateValue Table(Name Varchar(255))
Insert Into @TableWithDuplicateValue Values('Cat'),('Dog'),('Cat'),('Dog'),('Lion')

Select Name From @TableWithDuplicateValue

union

select null where 1=0

Go

Output
---------
Cat
Dog
Lion

如需更多替代方式,请访问我的博客

http://www.w3hattrick.com/2016/05/getting-distinct-rows-or-value-using.html