2017-05-25 53 views
-1

我有三列如何使用JOIN从某个列中选择仅具有唯一值的同一个表中的行?

Id Color Price 

台苹果和表这个数据

+----+-----------+------+ 
| Id | Color  | Price| 
+----+-----------+------+ 
| 1 | Red  | 5 | 
| 2 | Red  | 1 | 
| 3 | Green  | 3 | 
| 4 | Orange | 4 | 
+----+-----------+------+- 

在结果表我想看看:

+----+-----------+------+ 
| Id | Color  | Price| 
+----+-----------+------+ 
| 3 | Green  | 3 | 
| 4 | Orange | 4 | 
+----+-----------+------+ 

如何做到这一点使用连接没有子查询?

在这一点上我有这样的查询只选择红苹果:

select * 
from apples as a1 
left join apples as a2 
on a1.Id != a2.Id 
where a1.Color = a2.Color; 

回答

0

的灵感来自India.Rocket:

select A.Id, A.Color, A.Price 
    from Apples A 
    left join Apples A2 on A2.Color= A.Color and A2.Id<>A.Id 
    where A2.Id is null 
    group by A.Id, A.Color, A.Price 
0

你并不需要一个join ......这样的事情应该工作:

SELECT * 
FROM apples 
GROUP BY Color 
HAVING COUNT(*)=1 

I made a fiddle

+0

但是,我可以做到这一点只能通过加入或不使用具有或子查询? –

+1

你不能在分组时使用* ... –

+0

@MilanŠvec检查工作的小提琴...似乎在mySql上工作...我很确定它没有在T-SQL上,但检查,它在mySql上工作 – Jcl

0

内部查询:当您将它们组合在一起时,选择只有一个发生的所有颜色。外部查询:选择所有颜色为内部查询所选颜色之一的苹果。

select * from Apples 
    where Color in (
     select Color from Apples group by Color having count(*)=1 
    ) 
+2

如果您编辑答案以更详细地描述它的工作原理,将会很有帮助。另外,OP要求提供没有子查询的解决方案。 – lit

+0

它是如何工作的?内部查询:当您将它们组合在一起时,选择只有一个发生的所有颜色。外部查询:选择所有颜色为内部查询所选颜色之一的苹果。对于其他解决方案,请参阅其他解 –

+0

@lit:你可以编辑我的答案? –

0

或者只使用联接:

select Apples.* 
    from Apples 
    inner join 
    (
     select Color from Apples group by Color having count(*)=1 
    ) colors on colors.Color=Apples.Color 
+0

还有子查询,我想避开它们。 –

+0

你不能。这种类型的查询需要子查询或临时表。为什么你需要避免它? –

+0

或者在我上面的回答中使用带有IN()的解决方案。 –

1

修改您的查询了一下。只有1 left join,而不是subquerieshaving条款查询,并在大多数的数据库

看看这个工作。

select distinct a1.* 
from apples as a1 
inner join apples as a2 
on a1.Color < a2.Color; 

OR

select distinct a1.* 
from apples as a1 
inner join apples as a2 
on a1.Id > a2.Id 
where a1.Color != a2.Color; 

希望这有助于:-)

+0

只要有更高的ID重复(例如:用Id'5'添加另一个'Red''),你的第二个对我来说不起作用。第一个似乎工作得很好,它很聪明:-) – Jcl

+0

这就是我认为,这就是为什么我给了2个解决方案 –

+0

第一个应该工作。不错的主意 –

0

该查询在sqlfiddle并在MySQL 5.7的作品。

首先,我连接表以选择具有重复颜色的行。然后我加入结果表并从表中删除重复项。

select a1.* 
from apples as a1 
left join apples as a2 
on (a1.Id <> a2.Id and a1.Color = a2.Color) 
left join apples a3 
on (a2.Color is null and a1.Id = a3.Id) 
where a3.Color is not null; 

http://sqlfiddle.com/#!9/23df971/1

+0

加入a3毫无意义。左连接永远不会删除重复项。你可以直接修改最后一行为“where a2.Color not null”,看看我的另一个解决方案 –

相关问题