SQL-找到那些同时拥有战列舰和巡洋舰的国家
我有一个来自练习的小数据库示例SQL-找到那些同时拥有战列舰和巡洋舰的国家,sql,Sql,我有一个来自练习的小数据库示例 ## country type ## 1. Germany bb 2. USA bb 3. Japan bc 4. USA bb 5. Gt. Britain bc 6. Gt. Britain bb 7. USA bb 8. The Netherlands bc 9. Japan
## country type ##
1. Germany bb
2. USA bb
3. Japan bc
4. USA bb
5. Gt. Britain bc
6. Gt. Britain bb
7. USA bb
8. The Netherlands bc
9. Japan bb
现在的问题是:
找到那些同时拥有战列舰和巡洋舰的国家
我已经考虑过了,但我似乎不知道如何处理这个问题,因为一个简单的AND函数不起作用。按
国家/地区
列分组,只取那些具有多个不同装运类型的组
select country
from your_table
group by country
having count(distinct ship_type) = 2
一种常见的方法是过滤到具有一种类型的国家,比如说
bb
,然后只过滤到具有bc
且存在的国家()
:
由于要比较同一个表的行,我认为应该进行内部联接 比如:
select c.name from Country as c
INNER JOIN Country c1
ON c.name = c1.name
AND NOT c.ship = c1.ship;
您的数据库模式,或者更确切地说是表设计很差!美国有几个条目的bb值是一致的。您使用的RDBMS是什么?解释列名?表名?将其作为交叉表,“简单和”将起作用
从t组中逐个国家选择count(不同类型)>1的国家
,感谢这一点非常有效。出于好奇,这只是一个后续问题。如果有3种类型的船,我只想检查3种船中的2种,那么这将不再有效。那么你会怎么做?@NickW只需添加WHERE type IN('bb','bc')
,或者将计数更改为<3
,这取决于你是否关心这两种类型。如果你特别想要2种类型,而不是3种,那么计数很可能变成一个case表达式。这也行得通,那么这里还有一个问题:如果我有3种类型的船:bb,bc和bd。我如何选择只有bb和bc而没有bd的国家。据我所知,您可以进行多个内部连接,但我同意,如果您的请求想要处理N种类型的船舶,这并不是真正优雅的缩放方式
select c.name from Country as c
INNER JOIN Country c1
ON c.name = c1.name
AND NOT c.ship = c1.ship;
SELECT country
FROM YourTable
GROUP BY country
HAVING MAX(CASE type WHEN 'bb' THEN 1 END) = 1
AND MAX(CASE type WHEN 'bc' THEN 1 END) = 1
ORDER BY country