2016-11-19 6 views
1

これは以前の投稿の修正版です。これで私を助けてください。 サブクエリが正しい結果を得ている場合。しかし、私がフルスピードのAlert caseとField caseを実行すると、互いにオーバーライドされます。ストアドプロシージャのcaseステートメントが互いにオーバーライドします

Getting null value in status field, can anyone explain what I am going wrong?

(CASE  
    WHEN EXISTS(SELECT [GunSerialNo] FROM [dbo].[ArmouryIssueGun] 
       WHERE aig.ModifiedOn IS NOT NULL 
        AND aig.CreatedOn IS NOT NULL) 
     THEN 'In Armory' 

    WHEN EXISTS(SELECT aig.GunSerialNo 
       FROM [dbo].[ArmouryIssueGun] AS aig 
       INNER JOIN (SELECT * 
          FROM 
           (SELECT GunSerialNo, DATEADD(HOUR, EstimatedTime, CreatedOn) AS TIME_ADDED 
           FROM [ArmouryIssueGun]) ag 
          WHERE ag.TIME_ADDED<GETUTCDATE()) abd ON abd.GunSerialNo = aig.GunSerialNo 
       WHERE aig.ModifiedOn IS NULL 
        AND aig.CreatedBy IS NOT NULL) 
     THEN 'Alert' 

    WHEN EXISTS (SELECT aig.GunSerialNo 
       FROM [dbo].[ArmouryIssueGun] AS aig 
       INNER JOIN (SELECT * 
          FROM 
           (SELECT GunSerialNo, DATEADD(HOUR, EstimatedTime, CreatedOn) AS TIME_ADDED 
            FROM [ArmouryIssueGun]) ag 
          WHERE ag.TIME_ADDED>GETUTCDATE()) abd ON abd.GunSerialNo = aig.GunSerialNo 
       WHERE aig.ModifiedOn IS NULL 
        AND aig.CreatedBy IS NOT NULL) 
     THEN 'In Field' 
END) AS [Status], 
FROM 
    [dbo].[CarryAndUseLicence] cl 
INNER JOIN 
    [dbo].[Branch] b ON b.[BranchId] = cl.[BranchId] 
INNER JOIN 
    [dbo].[Gun] gun ON cl.[GunSerialNo] = gun.[SerialNo] 
INNER JOIN 
    [dbo].[ArmouryIssueGun] aig ON aig.[StaffId] = cl.[StaffId]  
+0

を、それが正常に動作しているかどうかを確認、有効な結果とすべてのサブクエリを交換し、手順を実行してみてください。それがどのように動作するか

答えて

0

問題は別名AIGの二重の使用です。 Exists-queryのエイリアスは、最上位のクエリのエイリアスよりも優先されます。この結果、Exists-queryには現在のレコードは含まれず、テーブル全体が表示されます。

WHEN EXISTS(SELECT aig2.GunSerialNo 
      FROM [dbo].[ArmouryIssueGun] AS aig2 
      INNER JOIN (SELECT * 
         FROM 
          (SELECT GunSerialNo, DATEADD(HOUR, EstimatedTime, CreatedOn) AS TIME_ADDED 
          FROM [ArmouryIssueGun]) ag 
         WHERE ag.TIME_ADDED<GETUTCDATE()) abd ON abd.GunSerialNo = aig.GunSerialNo 
      WHERE aig2.ModifiedOn IS NULL 
       AND aig2.CreatedBy IS NOT NULL) 
    THEN 'Alert' 

WHEN EXISTS (SELECT aig2.GunSerialNo 
      FROM [dbo].[ArmouryIssueGun] AS aig2 
      INNER JOIN (SELECT * 
         FROM 
          (SELECT GunSerialNo, DATEADD(HOUR, EstimatedTime, CreatedOn) AS TIME_ADDED 
           FROM [ArmouryIssueGun]) ag 
         WHERE ag.TIME_ADDED>GETUTCDATE()) abd ON abd.GunSerialNo = aig.GunSerialNo 
      WHERE aig2.ModifiedOn IS NULL 
       AND aig2.CreatedBy IS NOT NULL) 
    THEN 'In Field' 

または短い

WHEN EXISTS(SELECT * 
       FROM [ArmouryIssueGun] 
      WHERE GunSerialNo = aig.GunSerialNo 
       AND DATEADD(HOUR, EstimatedTime, CreatedOn) < GETUTCDATE() 
       AND ModifiedOn IS NULL 
       AND CreatedBy IS NOT NULL 
      ) 
    THEN 'Alert' 

WHEN EXISTS(SELECT * 
       FROM [ArmouryIssueGun] 
      WHERE GunSerialNo = aig.GunSerialNo 
       AND DATEADD(HOUR, EstimatedTime, CreatedOn) > GETUTCDATE() 
       AND ModifiedOn IS NULL 
       AND CreatedBy IS NOT NULL 
      ) 
    THEN 'In Field' 
関連する問題