Sailor (SID, Sname, Age)
Boat (BID, Bname, Color)
Reserve (SID, BID, Day) ------
助けていただければ幸いです。
Sailor (SID, Sname, Age)
Boat (BID, Bname, Color)
Reserve (SID, BID, Day) ------
助けていただければ幸いです。
このクエリでは、「緑色」以外の船舶を予約しているすべての船員を選択しました。彼らも緑色になっているかもしれませんが、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'
) ;
・ホープ、このことができます!
左寄せされたSQLは読みにくいので... – jarlh
これは本当にありがとうございます。結合を明示的にすることなくこのクエリを実行する方法はありますか? – helpmewithjava
明示的に 'on'を書かなくても、 'From Clause'の各テーブル名をカンマで区切って 'Join'と 'Where Clause'の文を明示的に記述する必要はありません。デフォルトでは、この結合は内部結合になります –
一つ別の方法:
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のを持っている場合は、いくつかのサンプル表データと予想される結果追加クエリ
これは素晴らしいことですが、このクエリの背後にある考えを教えていただけますか? 「ただ」のような問題に直面したら、どうやってそれに取り組んでいますか?ありがとうございました – helpmewithjava
例えばjoinという単語を明示的に言及せずに – helpmewithjava
@helpmewithjavaあなたは古い結合スタイルを意味しますか?カンマを使用していますか?または、他の何か ? –
から
distinct
キーワードを削除することができます - すべて同様フォーマットされたテキストを。現在のクエリの試行も表示してください。 – jarlh