2011-08-16 77 views
4

使用不同有数据的表像这样:我如何获得相同的结果,而不在查询

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

我想要检索的显示具有相同ID的记录之间的关系记录列表。 举例来说,我希望得到以下结果由我的查询设置:

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

这说明我的“从”和“到”对表中的每个项目。

我能得到这样的结果通过使用以下查询:

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

反正对我来说,获得相同的结果,而不在select语句中使用的“不同”设置?如果我不包含独特,我收回16条记录,而不是4.

+0

DISTINCT不应该被使用的任何特定原因? –

+0

这是一个我需要花费2.5分钟才能运行的更大查询的问题。我试图摆脱那个查询的外层不同,希望它可以提高性能,这只是一个简单的例子。 –

+2

只要我们清楚,您是否可以发布查询中提到的表A/B的架构/示例数据? –

回答

5

您没有DISTINCT获得重复行的原因是因为ID = x的每一行都会与ID = x的其他每一行进行连接。由于原始表格有两次(1,“Bob”),所以这两个将被加入ID = 1的另一个表格中的每一行中。

在进行连接之前删除重复项会做两件事:减少时间运行查询,并防止重复的行显示在结果中。

喜欢的东西(使用SQL的MySQL版本):

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的表格中的别名?

+0

我能够使用它来实现小的性能改进。谢谢。 –

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) 
4

在SQL和My SQL

​​
-1

消除了与工会的重复值,而无需使用不同

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

+0

请提供您在链接到您自己的网站之外提出的解决方案背景。 – coatless

相关问题