2013-02-01 17 views
8

Mam następujący Wiele do wielu relacji (patrz obrazek poniżej) na moim serwerze SQL.Zapytanie SQL Server dla wielu do wielu relacji

Many to many relationship

W większości przypadków, tam są 2 rzędy w tblWavelengths tabeli dotyczącej tblSensors stołowych (w niektórych przypadkach tylko 1, aw skrajnych przypadkach może być 20 rzędów)

Zrobiłem następujące proste zapytanie do pobierania danych z tych tabel 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 

Po uruchomieniu tej kwerendy mam następujące wyniki:

Result

Nadchodzi mój problem. Chcę napisać zapytanie, które filtruje tylko te czujniki (SensorName), które w danym momencie (DateTimeID) mają dwa wiersze (dwie różne długości fal) w tabeli tblWa długości. Tak na przykład chcę mieć wyniki bez czujnika 77902/001 - ponieważ ma on tylko jeden wiersz (jedna długość fali) związany z tblSensors w danym momencie w czasie

Odpowiedz

10

Możesz użyć funkcji okienkowej, aby dowiedzieć się liczbę długości fal dla każdej kombinacji 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; 

DODATEK

Jak po myśli zdałem sobie sprawę, że może mieć dwa wyników dla jednego czujnika w tym samym czasie z tej samej fali, co zwróci 2 rekordy, ale ich nie ma dwie różne długości fal. Ponieważ funkcje okienkowe nie obsługują funkcji DISTINCT, alternatywa jest niższa niż

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

Dziękuję, to jest dokładnie to, czego potrzebowałem. Muszę trochę głębiej zagłębić się w serwerze SQL – patex1987

+0

Nie można mieć tych samych długości fal na tym samym kanale w tym samym czasie, ale w każdym razie dziękuję za napiwek. Przydałoby się to w przyszłości. – patex1987

+0

Jest jeszcze coś, co muszę wiedzieć. Co jeśli chcę przestawić wartości długości fal, ale jest to dynamiczne obracanie, w niektórych przypadkach w jednym przypadku występuje tylko jedna długość fali. Możesz mi pomóc? – patex1987

Powiązane problemy