0

Created_On日付とLast_Updated_On日付のレコードを保存しているテーブルがあります。新しいレコードはそれぞれCreated_Onで書き込まれ、その後の更新はそれぞれ、同じCreated_Onで、ただし更新されたLast_Updated_Onで新しい行を書き込みます。

それぞれの最新の行を返すクエリを設計しようとしています。私が持っているものは次のようになります:

SELECT 
   t1.[id] as id,
   t1.[Store_Number] as storeNumber,
   t1.[Date_Of_Inventory] as dateOfInventory,
   t1.[Created_On] as createdOn,
   t1.[Last_Updated_On] as lastUpdatedOn
FROM [UserData].[dbo].[StoreResponses] t1 
JOIN (
      SELECT 
         [Store_Number], 
         [Date_Of_Inventory], 
         MAX([Created_On]) co, 
         MAX([Last_Updated_On]) luo 
      FROM [UserData].[dbo].[StoreResponses] 
      GROUP BY [Store_Number],[Date_Of_Inventory]) t2
   ON 
      t1.[Store_Number] = t2.[Store_Number] 
      AND t1.[Created_On] = t2.co 
      AND t1.[Last_Updated_On] = t2.luo 
      AND t1.[Date_Of_Inventory] = t2.[Date_Of_Inventory]
WHERE t1.[Store_Number] = 123 
ORDER BY t1.[Created_On] ASC

副選択は正常に機能します...Store_NumberとDate_Of_Inventoryでグループ化されたX行が表示され、そのうちのいくつかはnullのluo(Last_Updated_On)値を持っています。ただし、luoがnullである副選択の行は、全体の結果には表示されません。つまり、副選択で6つの結果が得られた場合、全体の結果では2つしか得られず、Last_Updated_OnがNULLでない行のみが得られます。

それで、テストとして、私は次のように書きました:

SELECT 1 WHERE NULL = NULL

結果は得られませんでしたが、実行すると:

SELECT 1 WHERE 1 = 1

1の結果が返されます。SQLServerがNULLをNULLに関連付けていないかのようです。

どうすればこれを修正できますか?両方の値がNULLの場合、2つのフィールドが比較されないのはなぜですか?

4

3 に答える 3

1

ANSI Null 比較はデフォルトでは有効になっていません。NULL は NULL と等しくありません。ヒントによってこれを有効にすることができます (ビジネス ケースと NULL のデータベース設計の使用がこれを必要とする場合)。

SET ansi_nulls off

以下を使用した別の基本的なターンアラウンド:

ON ((t1.[Store_Number] = t2.[Store_Number])  OR 
(t1.[Store_Number] IS NULL AND t2.[Store_Number] IS NULL))

POC の実行:

SET ansi_nulls off
SELECT 1 WHERE NULL = NULL

戻り値:

1
于 2012-12-29T00:00:35.470 に答える
1

合体を使用できます(Store_Numberが整数であると仮定した例)

   ON 
      Coalesce(t1.[Store_Number],0) = Coalesce(t2.[Store_Number],0) 
于 2012-12-29T00:47:28.037 に答える
1

これも機能します:

AND EXISTS (SELECT t1.Store_Number INTERSECT SELECT t2.Store_Number)
于 2012-12-29T00:56:40.117 に答える