2017-05-15 9 views
0
Sailor (SID, Sname, Age) 
Boat (BID, Bname, Color) 
Reserve (SID, BID, Day) ------ 

SQLクエリの船員に

助けていただければ幸いです。

+2

からdistinctキーワードを削除することができます - すべて同様フォーマットされたテキストを。現在のクエリの試行も表示してください。 – jarlh

答えて

1

このクエリでは、「緑色」以外の船舶を予約しているすべての船員を選択しました。彼らも緑色になっているかもしれませんが、SIDは 'in'クエリで捕捉されます。外側のクエリ(外部)は、 'where'節の 'not in'ステートメントを通じて緑色のボートのみを予約したセーラーを除外して与えるでしょう。

'not in'句の代わりに同じことをするにはleft joinも使うことができますが、 'left join'よりも 'not in'を優先します。これは、特に 'left join'よりもはるかに効率的です。大きなテーブル

はこれを試してください: -

Select a.SID,a.Sname,a.Age 
from 
Sailor a 
inner join 
Reserve b 
on a.SID=b.SID 
inner join 
Boat c 
on b.BID=c.BID 
where c.Color='green' 
and a.SID not in 
(
Select a.SID 
from 
Sailor a 
inner join 
Reserve b 
on a.SID=b.SID 
inner join 
Boat c 
on b.BID=c.BID 
where c.Color <> 'green' 
) ; 

・ホープ、このことができます!

+0

左寄せされたSQLは読みにくいので... – jarlh

+0

これは本当にありがとうございます。結合を明示的にすることなくこのクエリを実行する方法はありますか? – helpmewithjava

+0

明示的に 'on'を書かなくても、 'From Clause'の各テーブル名をカンマで区切って 'Join'と 'Where Clause'の文を明示的に記述する必要はありません。デフォルトでは、この結合は内部結合になります –

1

一つ別の方法:

select Sailor.* from Boat 
inner join 
(
    select Reserve.sid, Reserve.bid from Reserve 
    inner join (select SID from Reserve group by SID having count(distinct BID) = 1) t 
    on Reserve.SID = t.SID 
) tt 
on Boat.bid = tt.bid 
inner join Sailor 
on Sailor.sid = tt.sid 
where 
Boat.color = 'green' 

まあ、 "TT" サブクエリは、SIDのは一つだけのユニークなBIDを持ってReserveテーブルから行のみ(SIDとBID)が含まれています。したがって、SIDが2つ以上の異なるBIDを予約している場合、これらの行は無視されます。

これをBoatテーブルに登録し、フィルタwhere Boat.color = 'green'を使用すると、ボートの色は緑色になります。

Reserveテーブルで、1つのSIDが固有のBIDのを持っている場合は、いくつかのサンプル表データと予想される結果追加クエリ

+0

これは素晴らしいことですが、このクエリの背後にある考えを教えていただけますか? 「ただ」のような問題に直面したら、どうやってそれに取り組んでいますか?ありがとうございました – helpmewithjava

+0

例えばjoinという単語を明示的に言及せずに – helpmewithjava

+0

@helpmewithjavaあなたは古い結合スタイルを意味しますか?カンマを使用していますか?または、他の何か ? –

関連する問題