8

私の SQL サーバーには、次の多対多の関係 (下の図を参照) があります。

多対多の関係

ほとんどの場合、テーブル tblWavelengths にはテーブル tblSensors に関連する 2 つの行があります (場合によっては 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 テーブルに 2 つの行 (2 つの異なる波長) があるセンサー (SensorName) のみをフィルタリングするクエリを作成したいと考えています。したがって、たとえば、77902/001 センサーなしで結果を取得したいと考えています。これは、特定の時点で tblSensors に関連する行 (1 つの波長) が 1 つしかないためです。

4

1 に答える 1

10

ウィンドウ関数を使用して、センサー名と日時 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;

補遺

後から考えた結果、1 つのセンサーに対して同じ波長で同時に 2 つの結果が得られる可能性があることに気付きました。これは 2 つのレコードを返しますが、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;
于 2013-02-01T10:41:42.390 に答える