如何解决此特定数据库SQL查询

时间:2017-11-29 15:01:34

标签: mysql sql database

规格:

植物学家在两个表格中保存有关植物及其最喜欢的天气条件的数据: 植物和天气。编写查询以打印每个名称和天气类型 仅在一种天气中开花的植物。输出顺序无关紧要。

架构格式:

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查询的新手。

5 个答案:

答案 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等更加软化的工具

SQL Fiddle

答案 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