SQL学习:使用声明的INT变量从关联表取值实现WHERE条件查询
具体实现方法
基础需求实现:通过变量关联获取Italy对应的国家ID再查询
你不需要在WHERE子句直接硬编码国家名称匹配,只需要多声明一个存储国家ID的变量,提前从Country表把Italy对应的ID查出来存在变量里,后续过滤直接用这个整型ID匹配即可,代码示例:
-- 先声明需要用到的变量 DECLARE @TouristAttractionId INT = 8 DECLARE @ItalyCountryId INT -- 从Country表查询Italy对应的ID,赋值给自定义变量 SELECT @ItalyCountryId = Id FROM Country WHERE Name = 'Italy' -- 后续查询直接用变量存储的国家ID过滤,不需要重复做字符串名称匹配 SELECT City = ci.Name, Attraction = ta.Name, Description = ta.Description FROM city ci JOIN TouristAttraction ta on ta.CityId = ci.Id WHERE ci.CountryId = @ItalyCountryId UNION SELECT City = ci.Name, Attraction = ta.Name, Description = ta.Description FROM city ci JOIN TouristAttraction ta on ta.CityId = ci.Id WHERE ta.Id = @TouristAttractionId ORDER BY ci.Name, ta.Name ASC
这个写法完全实现了你想要的逻辑:没有在业务查询阶段硬编码国家名称,而是先通过关联Country表拿到Italy对应的ID,存到变量后再用于过滤,相比之前直接在主查询中关联Country表、用c.Name = 'Italy'做字符串匹配的写法,用存储的整型ID做过滤的执行效率也更高。
更简便的优化方式
你现在用两段结构完全一致的查询做UNION拼接,属于重复编写关联逻辑的冗余写法,可以从两个方向简化:
- 第一种简化:合并过滤条件,去掉不必要的UNION
你两段查询的表关联逻辑完全相同,只是WHERE的过滤条件不一样,完全可以把两个条件用OR合并到同一个查询里,效果和原UNION写法完全等价(UNION本身会自动去重,OR匹配也不会产生重复行),代码更简洁:DECLARE @TouristAttractionId INT = 8 DECLARE @ItalyCountryId INT SELECT @ItalyCountryId = Id FROM Country WHERE Name = 'Italy' SELECT City = ci.Name, Attraction = ta.Name, Description = ta.Description FROM city ci JOIN TouristAttraction ta on ta.CityId = ci.Id WHERE ci.CountryId = @ItalyCountryId OR ta.Id = @TouristAttractionId ORDER BY ci.Name, ta.Name ASC - 第二种简化:去掉硬编码的国家名,用指定景点反查所属国家
如果你的核心需求是“拿到和指定景点同国家的所有景点列表”,甚至不需要单独声明Italy对应的国家ID、也不需要硬编码'Italy'的国家名,直接通过已有的@TouristAttractionId反查它所属的国家ID即可,逻辑和参考实现方案一致:
这个写法的好处是,未来需要调整查询目标时,只需要修改@TouristAttractionId的值就行,不需要手动维护国家名和ID的映射关系,逻辑自包含。DECLARE @TouristAttractionId INT = 8 SELECT City = ci2.Name, Attraction = ta2.Name, ta2.Description FROM TouristAttraction ta1 JOIN City ci1 ON ci1.Id = ta1.CityId JOIN City ci2 ON ci2.CountryId = ci1.CountryId JOIN TouristAttraction ta2 ON ta2.CityId = ci2.Id WHERE ta1.Id = @TouristAttractionId ORDER BY ci2.Name, ta2.Name
内容的提问来源于stack exchange,提问作者gibbo789
相关产品推荐
相关产品推荐

