1

結合内に相関サブクエリが必要なクエリがあります。私が必要だと言うのは、私がそこにそれが必要だと思うということです...どうすればこれを行うことができますか? 私のクエリは次のとおりです。「マルチパート識別子「FIELDNAME GOES HERE」をバインドできませんでした」というエラーが表示されます...このクエリを機能させるにはどうすればよいですか?

SELECT FireEvent.ExerciseID, 
       FireEvent.FireEventID, 
       tempHitEvent.HitEventID, 
       FireEvent.AssociatedPlayerID, 
       tempHitEvent.AssociatedPlayerID, 
       FireEvent.EventTime, 
       tempHitEvent.EventTime, 
       FireEvent.Longitude, 
       FireEvent.Latitude, 
       tempHitEvent.Longitude, 
       tempHitEvent.Latitude, 
       tempHitEvent.HitResult, 
       FireEvent.AmmunitionCode, 
       FireEvent.AmmunitionSource, 
       FireEvent.FireEventID, 
       0 AS 'IsArtillery' 
FROM   FireEvent 
       LEFT JOIN (SELECT HitEvent.*, 
                         FireEvent.FireEventID, 
                         Rank() 
                           OVER ( 
                             ORDER BY HitEvent.EventTime) AS RankValue 
                  FROM   HitEvent 
                         WHERE FireEvent.EventTime BETWEEN 
                                    Dateadd(millisecond, -5000, 
                                    HitEvent.EventTime) AND 
                                               Dateadd(millisecond, 
                                               5000, HitEvent.EventTime) AND HitEvent.FiringPlayerID = FireEvent.PlayerID 
                   AND HitEvent.AmmunitionCode = 
                       FireEvent.AmmunitionCode
                   AND HitEvent.ExerciseID = 
                       'D289D508-1479-4C17-988C-5F6A847AE51E' 
                        AND FireEvent.ExerciseID = 
                       'D289D508-1479-4C17-988C-5F6A847AE51E' 
                   AND HitEvent.HitResult NOT IN ( 0, 1 ) ) AS 
                 tempHitEvent 
              ON ( 
              RankValue = 1
            AND tempHitEvent.FireEventID = 
                     FireEvent.FireEventID 
                     )
WHERE  FireEvent.ExerciseID = 'D289D508-1479-4C17-988C-5F6A847AE51E' 
ORDER BY HitEventID
4

3 に答える 3

5

LEFTJOINの代わりにOUTERAPPLYを使用します。私はあなたの条項のいくつかを動かさなければなりませんでした、しかし以下は望ましい結果を生み出すはずです

SELECT  FireEvent.ExerciseID, 
        FireEvent.FireEventID, 
        tempHitEvent.HitEventID, 
        FireEvent.AssociatedPlayerID, 
        tempHitEvent.AssociatedPlayerID, 
        FireEvent.EventTime, 
        tempHitEvent.EventTime, 
        FireEvent.Longitude, 
        FireEvent.Latitude, 
        tempHitEvent.Longitude, 
        tempHitEvent.Latitude, 
        tempHitEvent.HitResult, 
        FireEvent.AmmunitionCode, 
        FireEvent.AmmunitionSource, 
        FireEvent.FireEventID, 
        0 AS 'IsArtillery' 
FROM    FireEvent 
        OUTER APPLY
        (   SELECT  HitEvent.*, RANK() OVER (ORDER BY HitEvent.EventTime) AS RankValue 
            FROM    HitEvent 
            WHERE   HitEvent.FireEventID = FireEvent.FireEventID 
            AND     FireEvent.EventTime BETWEEN DATEADD(MILLISECOND, -5000, HitEvent.EventTime) AND DATEADD(MILLISECOND, 5000, HitEvent.EventTime) 
            AND     HitEvent.FiringPlayerID = FireEvent.PlayerID 
            AND     HitEvent.AmmunitionCode = FireEvent.AmmunitionCode
            AND     HitEvent.ExerciseID = FireEvent.ExerciseID
            AND     HitEvent.HitResult NOT IN ( 0, 1 ) 
        ) AS tempHitEvent 
WHERE   COALESCE(RankValue, 1) = 1
AND     FireEvent.ExerciseID = 'D289D508-1479-4C17-988C-5F6A847AE51E' 
ORDER BY FireEvent.HitEventID

一致するHitEventがある場合にのみ結果を返したい場合は、を使用しますCROSS APPLYCROSS APPLYにあるOUTER APPLYものINNER JOINにありLEFT JOINます。


補遺

これはすべて、を必要とOUTER APPLYせずに結合を使用して、HitEventを結合するためにサブクエリを使用せずに移動しRANK、HitEventテーブルだけでなくすべてのデータに対して関数を実行することによって実現できます。RANK関数の結果を句に含めることができるように、これはすべてサブクエリに移動する必要がありますWHERE

SELECT  *
FROM    (   SELECT  FireEvent.ExerciseID, 
                    FireEvent.FireEventID, 
                    HitEvent.HitEventID, 
                    FireEvent.AssociatedPlayerID, 
                    --HitEvent.AssociatedPlayerID, 
                    FireEvent.EventTime, 
                    HitEvent.EventTime [HitEventTime], 
                    FireEvent.Longitude [FireEventLongitute], 
                    FireEvent.Latitude [FireEventLatitute], 
                    HitEvent.Longitude [HitEventLongitute], 
                    HitEvent.Latitude [HitEventLatitute], 
                    HitEvent.HitResult , 
                    FireEvent.AmmunitionCode, 
                    FireEvent.AmmunitionSource,
                    0 [IsArtillery],
                    RANK() OVER(PARTITION BY HitEvent.FireEventID, HitEvent.FiringPlayerID, HitEvent.AmmunitionCode,HitEvent.ExerciseID ORDER BY HitEvent.EventTime) [RankValue]
            FROM    FireEvent 
                    LEFT JOIN HitEvent
                        ON HitEvent.FireEventID = FireEvent.FireEventID 
                        AND FireEvent.EventTime BETWEEN DATEADD(MILLISECOND, -5000, HitEvent.EventTime) AND DATEADD(MILLISECOND, 5000, HitEvent.EventTime) 
                        AND HitEvent.FiringPlayerID = FireEvent.PlayerID 
                        AND HitEvent.AmmunitionCode = FireEvent.AmmunitionCode
                        AND HitEvent.ExerciseID = FireEvent.ExerciseID
                        AND HitEvent.HitResult NOT IN ( 0, 1 ) 
        ) data
WHERE   RanKValue = 1

これにより、使用する場合と比較してパフォーマンスがわずかに向上するOUTER APPLY場合がありますが、そうでない場合があります。スキーマと処理しているデータの量によって異なります。テストに代わるものはありません。

于 2012-05-30T08:20:49.547 に答える
0

相関サブクエリは必要ありません。同時にいくつかのフィールドではありますが、比較的単純な結合をしているようです。

次の FROM 句は、サブクエリ内から両方のテーブルを参照する条件を抽出し、外側の JOIN 句に移動します。これは、ランク内のパーティションが期待どおりに機能しているかどうかに応じて、希望するものに近づきます。

FROM FireEvent fe left outer join
     (SELECT HitEvent.*, 
             Rank() OVER (partition by FiringPlayerID, ExerciseID, FireEventID, FireEventID
                          ORDER BY HitEvent.EventTime) AS RankValue 
      FROM HitEvent 
      WHERE HitEvent.ExerciseID = 'D289D508-1479-4C17-988C-5F6A847AE51E' AND  
            HitEvent.HitResult NOT IN ( 0, 1 )
     ) he
     ON he.FiringPlayerID  = fe.PlayerId and
        he.AmmunitionCode = fe.AmmunitionCode and
        fe.EventTime BETWEEN Dateadd(millisecond, -5000, he.EventTime) AND 
                             Dateadd(millisecond, 5000, he.EventTime) AND
        fe.ExerciseID = 'D289D508-1479-4C17-988C-5F6A847AE51E' AND
        RankValue = 1 , d
        he.FireEventID =  fe.FireEventID 
于 2012-05-30T02:30:45.037 に答える
0

このシナリオではクロス適用が機能します...

SELECT FireEvent.ExerciseID, 
       FireEvent.FireEventID, 
       tempHitEvent.HitEventID, 
       FireEvent.AssociatedPlayerID, 
       tempHitEvent.AssociatedPlayerID, 
       FireEvent.EventTime, 
       tempHitEvent.EventTime, 
       FireEvent.Longitude, 
       FireEvent.Latitude, 
       tempHitEvent.Longitude, 
       tempHitEvent.Latitude, 
       tempHitEvent.HitResult, 
       FireEvent.AmmunitionCode, 
       FireEvent.AmmunitionSource, 
       FireEvent.FireEventID, 
       0 AS 'IsArtillery' 
       ,RankValue
FROM   FireEvent
       CROSS APPLY  (SELECT HitEvent.*, 
                         FireEvent.FireEventID, 
                         Rank() 
                           OVER ( 
                             ORDER BY HitEvent.EventTime) AS RankValue 
                  FROM   HitEvent 
                         WHERE FireEvent.EventTime BETWEEN 
                                    Dateadd(millisecond, -5000, 
                                    HitEvent.EventTime) AND 
                                               Dateadd(millisecond, 
                                               5000, HitEvent.EventTime) AND HitEvent.FiringPlayerID = FireEvent.PlayerID 
                   AND HitEvent.AmmunitionCode = 
                       FireEvent.AmmunitionCode
                   AND HitEvent.ExerciseID = 
                       'D289D508-1479-4C17-988C-5F6A847AE51E' 
                        AND FireEvent.ExerciseID = 
                       'D289D508-1479-4C17-988C-5F6A847AE51E' 
                   AND HitEvent.HitResult NOT IN ( 0, 1 ) )  
                 tempHitEvent 
              WHERE 
              RankValue = 1
            AND tempHitEvent.FireEventID = 
                     FireEvent.FireEventID 

AND  FireEvent.ExerciseID = 'D289D508-1479-4C17-988C-5F6A847AE51E' 
ORDER BY HitEventID
于 2012-05-30T02:11:06.733 に答える