SQL Server查询多对多关系

SQL Server查询多对多关系,sql,sql-server,many-to-many,Sql,Sql Server,Many To Many,我的SQL server中有以下多对多关系(请参见下图) 在大多数情况下,表TBLWaveLength中有2行与表tblSensors相关(在某些情况下只有1行,在极端情况下可能有20行) 我进行了以下简单查询以从这3个表中检索数据: select W.DateTimeID,S.SensorName,S.SensorType,W.Channel,W.PeakNr,W.Wavelength from tblWavelengths as W Left Join tblSensorWavel

我的SQL server中有以下多对多关系(请参见下图)

在大多数情况下,表TBLWaveLength中有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
运行此查询后,我得到以下结果:

我的问题来了。我想写一个查询,只过滤那些在给定时刻(DateTimeID)在TBLWaveLength表中有两行(两个不同波长)的传感器(SensorName)。举个例子,我想得到没有
77902/001传感器-由于它在给定时刻只有一行(一个波长)与TBL传感器相关

因此,您可以使用窗口函数找出每个传感器名称/日期时间ID组合的波长数:

WITH Data AS
(   SELECT  W.DateTimeID,
            S.SensorName,
            S.SensorType,
            W.Channel,
            W.PeakNr,
            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;
附录

事后我意识到,一个传感器可能同时有两个相同波长的结果,这将返回两个记录,但不会有两个不同的波长。由于窗口函数不支持使用
DISTINCT

WITH Data AS
(   SELECT  W.DateTimeID,
            S.SensorName,
            S.SensorType,
            W.Channel,
            W.PeakNr,
            W.Wavelength,
            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;

谢谢,这正是我需要的。我必须在SQL Server内部进行更深入的研究不可能同时在同一通道上使用相同的波长,但无论如何,感谢您的提示。这在将来会有用的还有一件事我需要知道。如果我想旋转波长值,但它是动态旋转的,在某些情况下,som中只有一个波长,而som中只有两个。你能帮我吗?你能发布一个新的问题和你的预期输出,我会看看。谢谢这是我的新问题