2013-02-01 97 views
8

我在我的SQL服务器中有以下多对多关系(请参见下图)。针对多对多关系的SQL Server查询

Many to many relationship

在大多数情况下的2个行表tblWavelengths相关表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 

运行此查询我得到了以下结果后:

Result

这是我的问题。我想写一个查询,它只过滤那些在给定时间(DateTimeID)在tblWavelengths表中有两行(两个不同的波长)的传感器(SensorName)。因此,例如,我希望在没有 77902/001传感器的情况下得到结果 - 因为它在给定时间只有一行(一个波长)与tblSensors相关

回答

10

您可以使用窗口函数来查明波长的每个sensorname/datetimeid组合数目:

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; 

附录

作为后以为我意识到,你可能有两种结果为一个传感器在同一时间使用相同的波长,这会返回2条记录,但没有两个不同的波长。由于窗口函数不支持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; 
+0

谢谢,这正是我所需要的。我必须在SQL服务器内部深入一点点 – patex1987

+0

不可能在同一通道上同时使用相同的波长,但无论如何感谢您的建议。这将在未来有用 – patex1987

+0

还有一件事我需要知道。如果我想旋转波长值,但是它是动态旋转的,那么在某些情况下,在索姆案例中只有一个波长是2。你可以帮我吗? – patex1987