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
相关产品推荐
相关产品推荐

