Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-找到那些同时拥有战列舰和巡洋舰的国家_Sql - Fatal编程技术网

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