1

AT_DevicesというSQLテーブルがあり、各レコードがハードウェアの一部を表しているとします。ハードウェアの一部で発生する「イベント」を説明するAT_Event_Historyという2番目のテーブルがあります。イベントは、機器の紛失、破壊、廃棄などで構成されます。各イベントには、対応するステータスコードがあります。

AT_Devicesの各レコードの最新のイベントのコードを返すSQLを作成しました。デバイスにイベントが記録されていない場合、ステータスコードは0にする必要があるというビジネスルールがあります。

この場合、0を返すようにSQLクエリを作成しましたが、何らかの理由でNULLを返しています。なんで?

SELECT atDeviceHistory.StatusCodeNotNull AS StatusCode0  
 FROM dbo.AT_Devices atd LEFT OUTER JOIN 
(
    SELECT DeviceID,
     ParentCode,
     (CASE WHEN (StatusCode IS NOT NULL) THEN StatusCode ELSE 0 END) AS  
     StatusCodeNotNull,  
     WhenEntered AS StatusDate
FROM AT_Event_History as A
WHERE A.ParentCode=0 
AND A.WhenEntered >= (SELECT MAX(WhenEntered) 
                      FROM AT_Event_History AS B 
                      WHERE A.DeviceID=B.DeviceID AND ParentCode=0)
 ) atDeviceHistory ON atd.DeviceID=atDeviceHistory.DeviceID
4

2 に答える 2

4

を実行しているためleft join、一致するレコードがない場合、atDeviceHistory列を参照するものにはnull値が返されます。一致しないレコードを返したくない場合は、これをに変更しinner joinます。また、caseステートメントをCOALESCE:に変更することをお勧めします。

SELECT DeviceID,
     ParentCode,
     COALESCE(StatusCode ,0) AS StatusCodeNotNull,   
     WhenEntered AS StatusDate
FROM AT_Event_History as A

アップデート:

これを試して:

SELECT COALESCE(atDeviceHistory.StatusCode,0)  AS StatusCode0  
 FROM dbo.AT_Devices atd LEFT OUTER JOIN 
(
    SELECT DeviceID,
     ParentCode,
     StatusCode  
     WhenEntered AS StatusDate
FROM AT_Event_History as A
WHERE A.ParentCode=0 
AND A.WhenEntered >= (SELECT MAX(WhenEntered) 
                      FROM AT_Event_History AS B 
                      WHERE A.DeviceID=B.DeviceID AND ParentCode=0)
 ) atDeviceHistory ON atd.DeviceID=atDeviceHistory.DeviceID
于 2012-05-17T17:33:48.390 に答える
0

@Abe Miesslerがクエリ内の誤ったNULLチェックを指摘したので、実際に副選択を取り除き、クエリ全体を次のように書き直すことができます。

SELECT
  COALESCE(h.StatusCode, 0) AS StatusCode0,
  … /* whatever other columns you might need */
FROM dbo.AT_Devices atd
  LEFT OUTER JOIN AT_Event_History h ON atd.DeviceID = h.DeviceID
    AND h.ParentCode = 0
    AND h.WhenEntered = (SELECT MAX(WhenEntered)
                         FROM AT_Event_history
                         WHERE DeviceID = a.DeviceID AND ParentCode = 0)
于 2012-05-18T05:24:18.117 に答える