我需要在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
答案 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;