在两个不同的列上比较sql中的行

时间:2013-03-19 10:42:51

标签: sql

id address retailer
1   A        11
2   A         11
3   A         11
4   A         12
5   A         13
6   B         12
7   B         12
8   B         13

我的输出应该是

id address retailer
1   A        11
4   A         12
5   A         13
6   B         12
8   B         13

,即我的查询应该返回id 相同地址但不是同一零售商的ID。

怎么算这个?

5 个答案:

答案 0 :(得分:2)

假设您正在加入没有重复的列,这是目前最常见的情况:

  • inner join AB给出A intersect B的结果,即维恩图交集的内部。

  • outer join AB给出了A union B的结果,即维恩图联盟的外部部分。


示例:

假设您有两个表,每个表都有一个列,数据如下:

A    B
-    -
1    3
2    4
3    5
4    6

请注意,(1,2)对于A是唯一的,(3,4)是常见的,而(5,6)对B是唯一的。

<强> Inner join

使用任一等价查询的inner join给出两个表的交集,即它们共有的两行。

select * 
from a 
INNER JOIN b on a.a = b.b;

select a.*,b.*  
from a,b 
where a.a = b.b;

a | b
--+--
3 | 3
4 | 4

<强> Left outer join

left outer join将给出A中的所有行,以及B中的所有常见行。

select * 
from a 
LEFT OUTER JOIN b on a.a = b.b;
select a.*,b.*  
from a,b 
where a.a = b.b(+);

a |  b  
--+-----
1 | null
2 | null
3 |    3
4 |    4

<强> Full outer join

full outer join将为您提供AB的并集,即A中的所有行和B中的所有行。如果A中的某些内容没有相应的B中的数据,则B部分为空,反之亦然。

select * 
from a 
FULL OUTER JOIN b on a.a = b.b;

 a   |  b  
-----+-----
   1 | null
   2 | null
   3 |    3
   4 |    4
null |    6
null |    5

答案 1 :(得分:2)

尝试使用group by子句如下:

select min(id), address, retailer
from tab
group by address, retailer

答案 2 :(得分:0)

select min(id) as id,address, retailer 
from table1 
group by address, retailer
order by id

答案 3 :(得分:0)

您需要的查询是:

SELECT min(id), address, retailer
FROM table1 AS t1
group by address, retailer
order by address

这是source

答案 4 :(得分:0)

使用它:它正在工作:

 SELECT * FROM `sampletable` GROUP BY address, retailer