SQL Server查询多对多关系
发布时间:2020-12-12 16:22:53 所属栏目:MsSql教程 来源:网络整理
导读:我在我的SQL服务器中有以下多对多关系(见下图). 在大多数情况下,表tblWavelengths中有2行与表tblSensors相关,(在某些情况下只有1行,在极端情况下可能有20行) 我做了以下简单查询来从这3个表中检索数据: select W.DateTimeID,S.SensorName,S.SensorType,W.Cha
我在我的SQL服务器中有以下多对多关系(见下图).
在大多数情况下,表tblWavelengths中有2行与表tblSensors相关,(在某些情况下只有1行,在极端情况下可能有20行) 我做了以下简单查询来从这3个表中检索数据: select W.DateTimeID,S.SensorName,S.SensorType,W.Channel,W.PeakNr,W.Wavelength from tblWavelengths as W Left Join tblSensorWavelengths as SW on W.tblWavelengthID = SW.WavelengthID Left Join tblSensors as S on SW.SensorID = S.SensorID order by W.DateTimeID 运行此查询后,我得到以下结果: 这是我的问题.我想写一个查询,它只过滤那些传感器(SensorName),它在给定的时刻(DateTimeID)在tblWavelengths表中有两行(两个不同的波长).所以例如我想要没有结果 解决方法您可以使用窗口函数来查找每个sensorname / datetimeid组合的波长数:WITH Data AS ( SELECT W.DateTimeID,W.Wavelength,[Wcount] = COUNT(*) OVER(PARTITION BY s.SensorName,d.DateTimeID) from tblWavelengths as W LEFT JOIN tblSensorWavelengths as SW ON W.tblWavelengthID = SW.WavelengthID LEFT JOIN tblSensors as S ON SW.SensorID = S.SensorID ) SELECT DateTimeID,SensorName,SensorType,Channel,PeakNr,WaveLength FROM Data WHERE Wcount = 2 ORDER BY DateTimeID; 附录 后来我意识到你可能有两个结果,同时一个传感器具有相同的波长,这将返回2个记录,但没有两个不同的波长.由于窗口函数不支持使用DISTINCT,因此下面是另一种选择 WITH Data AS ( SELECT W.DateTimeID,W.tblWaveLengthID from tblWavelengths as W LEFT JOIN tblSensorWavelengths as SW ON W.tblWavelengthID = SW.WavelengthID LEFT JOIN tblSensors as S ON SW.SensorID = S.SensorID ) SELECT d.DateTimeID,d.SensorName,d.SensorType,d.Channel,d.PeakNr,d.WaveLength FROM Data d INNER JOIN ( SELECT DateTimeID,SensorName FROM Data GROUP BY DateTimeID,SensorName HAVING COUNT(DISTINCT tblWaveLengthID) = 2 ) t ON t.DateTimeID = d.DateTimeID AND t.SensorName = d.SensorName ORDER BY d.DateTimeID; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |