Sql server 有关相对基本的联接和子查询的访谈问题帮助

Sql server 有关相对基本的联接和子查询的访谈问题帮助,sql-server,Sql Server,我被要求: “为仅在一种天气类型下开花的每种植物打印以下列序列 天气类型 植物名称“ 模式 植物(表名) 植物名称,字符串,植物名称。这是主键 植物种类,刺,植物的种类 播种日期,日期,播种日期 天气(表名) 植物\种,串,植物的种 天气类型,字符串,植物开花的天气类型 我编写了下面的脚本,并根据示例输入对其进行了测试,获得了预期的结果。我不知道这是否被认为是“印刷”的结果 寻求对我可能错过的东西的理解。如何使此脚本“更高效”和/或“更好”和/或“更健壮” SELECT WEATHER.WEA

我被要求:

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

  • 天气类型
  • 植物名称“
  • 模式
    植物(表名)
    植物名称,字符串,植物名称。这是主键
    植物种类,刺,植物的种类
    播种日期,日期,播种日期

    天气(表名)
    植物\种,串,植物的种
    天气类型,字符串,植物开花的天气类型

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

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

    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
    
    我期望得到以下结果:

    样本输出
    阳光明媚的Marchantia1
    阳光玛尚提亚2


    在SQL Server管理工作室窗口中实现了预期的结果,但不确定是否是Asksk正在寻找的“打印”结果。

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

    在可读性和调试嵌套表表达式的易用性方面,我必须同意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)
    

    按b.PLANT\u名称分组,b.PLANT\u物种
    ——b.PLANT\u名称已经是主键,因此无需按第二列分组。这显然是一种更好的编写脚本的方法,但当我测试时返回一个错误=“Msg 207,级别16,状态1,第11行无效列名‘PLANT\u物种’。”