相对基本的JOIN和子查询的面试问题帮助

时间:2019-03-25 17:24:32

标签: sql-server

要求我:

“为仅在一种类型天气下开花的每种植物打印以下列顺序。

  1. WEATHER_TYPE
  2. PLANT_NAME”

模式
植株(表名)
PLANT_NAME,字符串,植物名称。这是主键。
PLANT_SPECIES,ing,植物的种类。
SEED_DATE,日期,种子播种的日期。

天气(表名称)
PLANT_SPECIES,字符串,植物的种类。
WEATHER_TYPE,字符串,植物开花的天气类型。

我在下面编写了脚本,并针对示例输入对其进行了测试,并获得了预期的结果。我不知道这是否是“打印”结果。

寻求对我可能错过的内容的理解。我如何才能使此脚本“更高效”和/或“更好”和/或“更健壮”?

SELECT WEATHER.WEATHER_TYPE, a.PLANT_NAME
FROM (SELECT b.PLANT_NAME, b.PLANT_SPECIES
      FROM (SELECT PLANTS.PLANT_NAME, PLANTS.PLANT_SPECIES, PLANTS.SEED_DATE, WEATHER.WEATHER_TYPE
            FROM PLANTS JOIN WEATHER 
            ON PLANTS.PLANT_SPECIES = WEATHER.PLANT_SPECIES) b
      GROUP BY b.PLANT_NAME, b.PLANT_SPECIES
      HAVING count(*) = 1) a JOIN WEATHER
ON a.PLANT_SPECIES = WEATHER.PLANT_SPECIES

我希望得到以下结果:

样本输出
Sunny Marchantia1
阳光明媚的Marchantia2

我在SQL Server Management Studio窗口中达到了预期的结果,但是不确定这是否是提问者正在寻找的“打印”结果。

2 个答案:

答案 0 :(得分:3)

我个人认为,与嵌套的“表表达式”相比,CTE更易于阅读和调试。我会做类似的事情:

with
x as (
  select p.plant_name
  from plants p
  join weather w on w.plant_species = p.plant_species
  group by p.plant_name
  having count(*) = 1
)
select x.plant_name, w.weather_type
from x
join weather w on w.plant_species = x.plant_species

答案 1 :(得分:0)

在可读性和调试嵌套表表达式的易用性方面,我必须同意The Impaler。作为CTE的另一种选择(这确实是更好的选择),如果您确实想嵌套事物而又不想过多考虑,则可以使用相关的子查询。它会更容易阅读,但是随着结果集的增长,您将失去效率。

SELECT w.weather_type, p.plant_name 
FROM plants p
JOIN weather w 
    ON w.plant_species = p.plant_species
WHERE (SELECT COUNT(1) FROM dbo.weather WHERE plant_species = w.plant_species) = 1

或分组...

SELECT w.weather_type, p.plant_name 
FROM plants p
JOIN weather w 
    ON w.plant_species = p.plant_species
WHERE w.plant_species IN (SELECT plant_species FROM dbo.weather  GROUP BY plant_species HAVING COUNT(1) = 1)