2013-02-01 72 views
8

Tôi có nhiều mối quan hệ Nhiều đến nhiều (Xem hình bên dưới) trong máy chủ SQL của tôi.Truy vấn máy chủ SQL cho nhiều mối quan hệ

Many to many relationship

Trong hầu hết các trường hợp có của được 2 hàng trong tblWavelengths bảng liên quan đến tblSensors bảng, (trong một số trường hợp chỉ có 1, và trong trường hợp nặng có thể có 20 dòng)

tôi đã thực hiện những điều sau đây truy vấn đơn giản để lấy dữ liệu từ những 3 bảng:

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 

sau khi chạy truy vấn này, tôi nhận được kết quả như sau:

Result

Đây là vấn đề của tôi. Tôi muốn viết một truy vấn mà chỉ lọc những cảm biến (SensorName) mà tại một thời điểm nhất định trong thời gian (DateTimeID) có hai hàng (hai bước sóng khác nhau) trong bảng tblWavelengths. Vì vậy, ví dụ tôi muốn có kết quả mà không cần Cảm biến 77902/001 - bởi vì nó chỉ có một hàng (một bước sóng) liên quan đến bộ phát tblors tại một thời điểm cụ thể trong thời gian

Trả lời

10

Bạn có thể sử dụng chức năng cửa sổ để tìm hiểu số lượng bước sóng cho từng tổ hợp 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; 

PHỤ LỤC

là một sau khi suy nghĩ tôi nhận ra rằng bạn có thể có hai kết quả cho một cảm biến cùng một lúc với các bước sóng tương tự, trong đó sẽ trả về 2 bản ghi, nhưng không có hai bước sóng khác nhau. Vì các chức năng cửa sổ không hỗ trợ việc sử dụng DISTINCT một giải pháp thay thế dưới đây là

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

Cảm ơn bạn, đây chính xác là những gì tôi cần. Tôi phải đào sâu hơn một chút bên trong máy chủ SQL – patex1987

+0

Nó không thể có cùng bước sóng trên cùng một kênh cùng một lúc, nhưng dù sao cũng cảm ơn bạn về mẹo của bạn. Nó sẽ hữu ích trong tương lai – patex1987

+0

Còn một điều nữa tôi cần biết. Điều gì sẽ xảy ra nếu tôi muốn Pivot các giá trị bước sóng, nhưng nó xoay vòng động, trong một số trường hợp chỉ có một bước sóng trong trường hợp som hai. Bạn có thể giúp tôi được không? – patex1987

Các vấn đề liên quan