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物种’。”