You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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即可,逻辑和参考实现方案一致:
    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
    
    这个写法的好处是,未来需要调整查询目标时,只需要修改@TouristAttractionId的值就行,不需要手动维护国家名和ID的映射关系,逻辑自包含。

内容的提问来源于stack exchange,提问作者gibbo789

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 04:06:06