Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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_Oracle - Fatal编程技术网

Sql 如何仅获取从另一个表中找到每个值的行?

Sql 如何仅获取从另一个表中找到每个值的行?,sql,oracle,Sql,Oracle,我有以下表格模式: 人: 体育: 速度: 我想解决的问题是:哪些体育运动是每个人都使用的,而且也有明星价值 我想要的结果是: 我的问题是:如何用select语句实现这一点?我目前的解决办法是: SELECT * FROM speed JOIN (SELECT * FROM person JOIN sports USING (name)) USING (name) WHERE STAR = 'good' 我不知道如何过滤更多 替代表格 国家: Name | Capital USA | Wash

我有以下表格模式:

人: 体育: 速度: 我想解决的问题是:哪些体育运动是每个人都使用的,而且也有明星价值

我想要的结果是: 我的问题是:如何用select语句实现这一点?我目前的解决办法是:

SELECT * FROM speed JOIN 
(SELECT * FROM person JOIN sports USING (name)) USING (name) WHERE STAR = 'good'
我不知道如何过滤更多

替代表格 国家:

Name | Capital
USA | Washington
Germany | Berlin
France | Paris
Poland | Warsaw
运动

Country | Sport 
Germany | Football 
Belgium | Baseball
Belgium | Football 
France | Football 
Poland | Baseball 
Poland | Football 
区域

Country | Area 
Germany | Europe
Belgium | Europe
France | Europe
Poland | Europe
新问题:每个欧洲国家都玩哪项运动


输出:足球,因为它是由德国、法国、比利时和波兰进行的

所有的连接都是使用name列完成的,但是正如您所看到的,在每个表中name列的含义不同。您必须使用
on
子句并指定哪些列必须匹配

with person(name, year, sports) as (
  select 'Hans', 23, 'Football' from dual union all
  select 'Hans', 23, 'Baseball' from dual union all
  select 'Hans', 23, 'Badminton' from dual union all
  select 'Albert', 25, 'Baseball' from dual union all
  select 'Albert', 25, 'Badminton' from dual
), sports(name, tempo, amount) as (
  select 'Football', 'Fast', 5 from dual union all
  select 'Baseball', 'Slow', 3 from dual union all
  select 'Badminton', 'Fast', 4 from dual
), speed(name, star) as (
  select 'Fast', 'Good' from dual union all
  select 'Slow', 'Bad' from dual
)
select person.*
from person
join sports on person.sports = sports.name
join speed on sports.tempo = speed.name
where speed.star = 'Good'

这是一个使用关系代数运算解决的经典问题:

SP - "Good" sports used by persons
P  - All persons

SP                  DIVIDE   P       =   S
-----------------            ------      ---------
Name    Sports               Name        Sports   
-----------------            ------      ---------
Hans    Football             Hans        Badminton
Hans    Badminton            Albert      
Albert  Badminton                        
下面可以找到用SQL解释和表达此语句的示例:

使用
COUNT
函数解决此问题的示例如下:

SELECT p.sports
FROM person p
JOIN sports st ON st.name = p.sports
JOIN speed sd ON tempo = sd.name AND star = 'Good'
GROUP BY p.sports
HAVING COUNT(*) = (SELECT COUNT(DISTINCT name) FROM person)
各国最新情况:

SELECT s.sport
FROM sports s
JOIN region r ON s.country = r.country AND r.area = 'Europe'
GROUP BY s.sport
HAVING COUNT(*) = (SELECT COUNT(*) FROM region WHERE area = 'Europe')

(1) 用您正在使用的数据库标记您的问题。(2) 显示您想要的结果。现在还不清楚您真正想要的是什么。不需要子查询,只需执行另一个联接即可。@jarlh这到底是什么意思?选择。。。从…起参加参加这些字段有不同的含义并不重要。它们只是假的表格,不是真的。非常感谢你的回答,不幸的是,当我发布这个问题时,我把我的表格弄错了。我在“alterantiv表”下更新了它们。你可以编辑你的新问题的答案吗?这将是相同的问题。逻辑很简单。使用GROUP BY,从运动表中计算每项运动的欧洲国家数量,然后将其与区域表中的欧洲国家总数进行比较。尝试在您的问题中编写这样一个SQL查询,如果它不起作用,我将提供帮助。如果您对解决方案仍有问题,我已更新了我的答案。
with person(name, year, sports) as (
  select 'Hans', 23, 'Football' from dual union all
  select 'Hans', 23, 'Baseball' from dual union all
  select 'Hans', 23, 'Badminton' from dual union all
  select 'Albert', 25, 'Baseball' from dual union all
  select 'Albert', 25, 'Badminton' from dual
), sports(name, tempo, amount) as (
  select 'Football', 'Fast', 5 from dual union all
  select 'Baseball', 'Slow', 3 from dual union all
  select 'Badminton', 'Fast', 4 from dual
), speed(name, star) as (
  select 'Fast', 'Good' from dual union all
  select 'Slow', 'Bad' from dual
)
select person.*
from person
join sports on person.sports = sports.name
join speed on sports.tempo = speed.name
where speed.star = 'Good'
SP - "Good" sports used by persons
P  - All persons

SP                  DIVIDE   P       =   S
-----------------            ------      ---------
Name    Sports               Name        Sports   
-----------------            ------      ---------
Hans    Football             Hans        Badminton
Hans    Badminton            Albert      
Albert  Badminton                        
SELECT p.sports
FROM person p
JOIN sports st ON st.name = p.sports
JOIN speed sd ON tempo = sd.name AND star = 'Good'
GROUP BY p.sports
HAVING COUNT(*) = (SELECT COUNT(DISTINCT name) FROM person)
SELECT s.sport
FROM sports s
JOIN region r ON s.country = r.country AND r.area = 'Europe'
GROUP BY s.sport
HAVING COUNT(*) = (SELECT COUNT(*) FROM region WHERE area = 'Europe')