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

yc0p9oo0  于 2023-01-16  发布在  其他
关注(0)|答案(3)|浏览(169)

我被要求:
为每种只在one type天气下开花的植物打印以下列序列。
1.天气类型
1.工厂名称”

架构

  • PLANTS(表格名)
  • PLANT_NAME,字符串,工厂的名称。这是主键。
  • PLANT_SPECIES,刺,植物的种类。
  • 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

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

ufj5ltwl

ufj5ltwl1#

我个人认为与嵌套的“表表达式”相比,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
mo49yndu

mo49yndu2#

关于嵌套表表达式的可读性和调试的简易性,我不得不同意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)
c7rzv4ha

c7rzv4ha3#

SELECT w.weather_type, p.plant_name 
FROM plants p
JOIN weather w 
ON w.plant_species = p.plant_species
WHERE w.weather_type="Sunny";

相关问题