查找出现次数少于3次的元组

时间:2017-03-08 06:32:31

标签: sql oracle

我需要在oracle中编写一个sql查询来查找在表中只出现少于3次的元组。现在,如果我只使用一个表,那么解决方案很简单:

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

然而,由于我正在使用的表格,它有点复杂。这两个表是Classes和Ships。类表列出了某艘船所属的类,而船舶表列出了船的名称以及类。这两个表都没有任何外键,这意味着我们可能会在classes表中获得某个类,而不在ship表中。这是表格的样子:

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');

所以Renown会被列出来,因为它只出现在船只表中两次,但是我也希望俾斯麦类也被列出来,因为它只在类表中列出一次因此被列出来少于3次。我不明白的是,Classes表中的类将始终只列出一次,但是如果该类在ship表中出现的次数超过3次,那么它的次数并不重要。列表中列出的。我想我需要做一个外部联接来完成这项工作,但我不确定那会是什么样子。

所以我期望的结果是

Renown
Bismarck

2 个答案:

答案 0 :(得分: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; 

答案 1 :(得分: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;