簡體   English   中英

SQL Server查詢多對多關系

[英]SQL Server Query for Many to Many Relationship

我的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

運行此查詢后,我得到以下結果:

結果

這是我的問題。 我想寫一個查詢,它只過濾那些在給定時刻(DateTimeID)在tblWavelengths表中有兩行(兩個不同波長)的傳感器(SensorName)。 因此,例如,我希望得到沒有77902/001傳感器的結果 - 因為它在給定時刻只有一行(一個波長)與tblSensors相關

您可以使用窗口函數來找出每個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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM