要求我:
“为仅在一种类型天气下开花的每种植物打印以下列顺序。
模式
植株(表名)
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窗口中达到了预期的结果,但是不确定这是否是提问者正在寻找的“打印”结果。
答案 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)