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

SQL Server:如何合并两个查询,用Distinct结果关联内连接查询

嘿,这里有几种实用的方法能把这两个查询合并起来,你可以根据自己的场景选最合适的:

方法1:用IN子查询直接过滤

这是最直观的方式,把第一个获取去重DeviceID的查询作为子查询,放到第二个查询的WHERE条件里,只保留符合条件的DeviceID记录:

SELECT f.PracticeID, f.Name, D.DeviceID, d.SerialNumber ...
-- 记得补全你第二个查询的FROM和表连接逻辑,比如:
-- FROM Practice f INNER JOIN Devices d ON f.SomeID = d.SomeID
WHERE d.DeviceID IN (
    SELECT DISTINCT deviceid 
    FROM session 
    WHERE CAST(createdon AS DATE) BETWEEN '01/01/2018' AND '01/30/2018' 
      AND LEN(deviceid) > 10
)

这种写法简单直接,适合快速实现需求,只要保证第二个查询里的d.DeviceID和子查询的deviceid字段类型一致、匹配正确就行。

方法2:用INNER JOIN关联过滤结果

如果你处理的是大数据量,这种方式可能比IN子查询性能更好(数据库能更高效地优化连接操作)。把第一个查询的结果作为临时表,和主查询做内连接:

SELECT f.PracticeID, f.Name, D.DeviceID, d.SerialNumber ...
-- 补全你的主表连接逻辑
FROM Practice f 
INNER JOIN Devices d ON f.PracticeID = d.PracticeID -- 示例连接条件,换成你的实际条件
INNER JOIN (
    SELECT DISTINCT deviceid 
    FROM session 
    WHERE CAST(createdon AS DATE) BETWEEN '01/01/2018' AND '01/30/2018' 
      AND LEN(deviceid) > 10
) AS FilteredDevices ON d.DeviceID = FilteredDevices.deviceid

内连接会自动过滤掉不匹配的DeviceID,只保留在第一个查询结果里的记录。

方法3:用CTE让代码更易读

如果你的查询逻辑后续可能需要扩展,用CTE(公共表表达式)可以让代码结构更清晰,可读性更强:

WITH FilteredDeviceIDs AS (
    -- 先定义好要过滤的DeviceID列表
    SELECT DISTINCT deviceid 
    FROM session 
    WHERE CAST(createdon AS DATE) BETWEEN '01/01/2018' AND '01/30/2018' 
      AND LEN(deviceid) > 10
)
-- 然后在主查询里使用这个CTE
SELECT f.PracticeID, f.Name, D.DeviceID, d.SerialNumber ...
FROM Practice f 
INNER JOIN Devices d ON f.PracticeID = d.PracticeID
-- 可以用IN子查询引用CTE,也可以用JOIN
WHERE d.DeviceID IN (SELECT deviceid FROM FilteredDeviceIDs)

CTE相当于一个临时的结果集,你可以在主查询里多次引用,后续修改过滤条件也更方便。

几个注意点

  • 记得补全第二个查询里省略的FROM和表连接逻辑,不然查询会报错;
  • 日期格式尽量用数据库兼容的标准格式(比如'2018-01-01'),避免因日期解析导致的错误;
  • 如果你的DeviceID是大小写敏感的,必要时可以用UPPER(d.DeviceID) = UPPER(FilteredDevices.deviceid)这种方式保证匹配一致性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:21:06