2017-05-25 6 views
-1

私は3つの列、私が見たいテーブルを結果で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

を支援します。

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

しかし、私はこれだけ結合やHAVINGまたはサブクエリを使用せずに使用して行うことができますか? –

+1

グループ化するときに*使用することはできません... –

+0

@ Milanvevecは作業フィドルをチェックします... mySqlで動作するようです...私はそれがT-SQLではなくチェックされ、それはmySqlで動作することを確信していました – Jcl

0

内部クエリ:1つの発生を1つだけ持つすべての色をグループ化するときに選択します。外部クエリ:内部のクエリで選択された色の1つであるすべてのリンゴを選択します。

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

これがどのように動作するかについて詳しく説明するために回答を編集すると役に立ちます。また、OPはサブクエリのないソリューションを求めました。 – lit

+0

どのように動作しますか?内部クエリー:一緒にグループ化するときに、1つの出現しかないすべての色を選択します。外部クエリ:内部のクエリで選択された色の1つであるすべてのリンゴを選択します。他の解決策については、他の回答を参照してください。 –

+0

@lit:あなたは私の答えを編集できますか? –

0

または使用ONLY加入:

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

は、クエリビットを修正しました。クエリはleft joinで、subqueriesまたはhavingという句はなく、ほとんどのデータベースで動作します。

これをチェックしてください。

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; 

希望これはIndia.Rocketに触発:-)

+0

IDが重複しているとすぐに、2番目のIDは重複しません(例:ID「5」の別の「赤」を追加)。最初のものはうまくいくように見えますが、それはかなり巧妙です:-) – 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

に参加することは意味がありません。左結合によって重複は削除されません。最後の行を "a2.Colorがnullでない"に直接変更することができます。私の別の解決策を見てください。 –

関連する問題