2017-03-08 5 views
2

テーブルに3回以下しか表示されないタプルを検索するには、oracleにSQLクエリを記述する必要があります。私は一つだけのテーブルで働いている場合さて解決策は簡単です:それはので、私が働いているテーブルではもう少し複雑だが3倍未満で表示されるタプルを見つける

Select class 
From Ships 
GROUP BY class 
Having COUNT(class) < 3; 

。 2つのテーブルはクラスと船です。クラステーブルは、特定の船がどのクラスに属しているかを示しており、船のテーブルは船の名前とクラスをリストしています。どちらのテーブルにも外部キーがありません。つまり、船のテーブルにないクラステーブルで特定のクラスを取得する可能性があります。ここのテーブルには、どのように見えるか:

Create Table Classes (
    class Varchar(40), 
    type Char (2), 
    country Varchar(15) 
); 
Create Table Ships (
    name Varchar(40), 
    class Varchar(40) 
); 

そして、我々は次のようになり、テーブルを取得する可能性があります:

Classes: 
('Bismarck','bb','Germany'); 
('Kongo','bc','Japan'); 
('Renown','bc','Gt. Britain'); 

Ships: 
('Hiei','Kongo'); 
('Haruna','Kongo'); 
('Renown','Renown'); 
('Repulse','Renown'); 
('Kongo','Kongo'); 
('Kirishima','Kongo'); 

それは私も欲しいだけ二回しかし船のテーブルに表示されますので、だから、レナウンが出て記載されているになるだろうBismarckクラスはクラステーブルに一度しかリストされていないので、3回もリストされていません。私が理解できないことは、Classesテーブルのクラスは常に1回だけリストに表示されますが、クラスが船のテーブルに3回以上現れる場合、クラステーブルに何回リストされているかは関係ありません。私はこの作業をするために外部結合を行う必要があると思うが、どうなるかわからない。

だから私は期待した結果が、あなたが参加して、(*)カウント左を使用することができ

Renown 
Bismarck 
+0

したがって、2つのテーブルを結合し、クラス値が3回未満の場合にのみ結果を表示しますか? – Zero

+0

あなたは質問し、予想される選択結果を追加します。 – scaisEdge

答えて

1

私が正しくあなたの目標を理解している場合、あなたがする必要があるすべてはあなたを置き換えるですFROM Ships~FROM Ships s [join type] Classes c on s.class = c.class。私はあなたが探していた結果セットの種類がわからないので、実際に何を使用するのかを100%確信しているわけではありません。

--Selects only matches, so "Bismarck" wouldn't be shown 
Select class 
From Ships s inner join Classes c on s.class = c.class 
GROUP BY class 
Having COUNT(s.class) < 3; 

あなたの要件は、内側/左/右に反映されていない場合は、あなたが常にfull outer join' and specify conditions in WHERE`句のために行くことができる種類に参加します。

Select class 
From Ships s full outer join Classes c on s.class = c.class 
WHERE s.class IS NOT NULL AND [other conditions] 
GROUP BY class 
Having COUNT(s.class) < 3; 
0

ある

select c.class, count(*) 
From Class as c 
left join Ships as s on c.class = s.class 
GROUP BY c.class 
Having COUNT(*) < 3; 
関連する問題