规格:
植物学家在两个表格中保存有关植物及其最喜欢的天气条件的数据: 植物和天气。编写查询以打印每个名称和天气类型 仅在一种天气中开花的植物。输出顺序无关紧要。
架构格式:
PLANT(NAME,SPECIES,SEED_DATE)
WEATHER(PLANT_SPECIES,TYPE)
属性说明:
姓名: (String) Description of the plant.
物种: (String) The species of the plant.
Plant_Species: (String) The species of the plant.
输入: (String) The type of weather in which the plant will bloom.
Seed_date: (Date) The date the seed was planted.
输出格式:
结果应包含每个开花的植物的名称和天气类型 只有一种类型的天气,采用以下格式显示。
给定输入和输出的说明:
植物物种苔藓植物仅在阳光充足的天气中开花。所以结果包含了 名为Marchantia1和Marchantia2的植物,其种类为苔藓植物。 植物种类裸子植物在晴天和阴雨天气中开花。所以,结果没有 包含任何植物名称,其种类是裸子植物。 (请注意,天气表可能有重复的条目)
注意:不,这不是作业! -_-这是一个在面试中给出的问题(已经结束)。我真的很期待解决它。但是可能有很多测试用例我的简单sql查询无法解决。所以我需要你的帮助。我是SQL查询的新手。
答案 0 :(得分:0)
只需定期加入即可获取工厂名称及其天气类型。
要仅列出仅在一个气候中发生的植物,请将其放入where
子句中
一个子查询,以排除你不需要展示的物种。
select distinct plt.NAME, wht.TYPE
from PLANT plt
join WEATHER wht on wht.PLANT_SPECIES = plt.SPECIES
where 1 = (select count(distinct(wht0.TYPE)) from
WEATHER wht0
where wht0.PLANT_SPECIES = plt.SPECIES)
如果使用TSQL而不是MySQL,这个解决方案将(跳跃地)在任何DBMS上工作,例如你可以利用RANK,CTE,ROWNUMBER等更加软化的工具
答案 1 :(得分:0)
从这开始:
SELECT w.plant_species
, COUNT(DISTINCT w.type)
FROM weather w
GROUP BY w.plant_species
然后添加一个条件来消除第二个表达式大于1的行。因为这是一个聚合表达式,它不能进入WHERE
子句但它可以进入{{1子句。如果我们将它包装在聚合函数中,我们也可以返回天气类型。
HAVING
下一步是从SELECT w.plant_species
, COUNT(DISTINCT w.type)
, MAX(w.type)
FROM weather w
GROUP BY w.plant_species
HAVING COUNT(DISTINCT w.type) = 1
表中获取匹配PLANT
的行。
我们可以将第一个查询用作内联视图:
species
答案 2 :(得分:0)
select distinct p.name, w.type from plant p join weather w
on p.SPECIES = w.PLANT_SPECIES
join (
select PLANT_SPECIES, TYPE, count(*) from WEATHER
group by (PLANT_SPECIES, TYPE) having count(*) > 1) as a
on a.PLANT_SPECIES = w.PLANT_SPECIES;
答案 3 :(得分:0)
选择区* 从(选择一个名称, 类型 从植物a 加入(SELECT plant_species 从天气 按植物种类分组 拥有计数(DISTINCT类型1)= 1)b 在a.species = b.plant_species上 加入(SELECT plant_species, 类型 从天气)c 在a.species = c.plant_species)n;
答案 4 :(得分:0)
这简单又容易
select distinct plt.NAME, wht.TYPE
from PLANT plt
join WEATHER wht on wht.PLANT_SPECIES = plt.SPECIES
Group by plt.name
Having count(distinct(wht.TYPE)) =1