2010-07-16 41 views
4

我的SQL查询应返回以前的记录(索赔)。 Previous表示它具有不同的主键(idData),相等的SSN_Number和更早的Received_Date。问题是Received_Date可能相等,所以我必须寻找另一列。优先级应与排序顺序相同。 我在做什么错误,因为查询返回两个ID的另一个记录(两个索赔都是以前的对方)?我的SQL有什么问题? (查找“前一个”记录)

我的两个测试,记录如下: same SSN_Number http://www.bilder-hochladen.net/files/4709-kr.jpg

的SQL查询是这样的:

SELECT TOP (1) Claim.idData  AS ClaimID, 
       PrevClaim.idData AS PrevClaimID 
FROM tabData AS Claim 
     INNER JOIN tabData AS PrevClaim 
     ON Claim.SSN_Number = PrevClaim.SSN_Number 
      AND Claim.idData <> PrevClaim.idData 
      AND (Claim.Received_Date > PrevClaim.Received_Date 
        OR Claim.Claim_Creation_Date > PrevClaim.Claim_Creation_Date 
        OR Claim.Repair_Completion_Date > 
         PrevClaim.Repair_Completion_Date 
        OR Claim.Claim_Submitted_Date > 
         PrevClaim.Claim_Submitted_Date) 
WHERE (Claim.idData = @claimID) 
ORDER BY PrevClaim.Received_Date DESC, 
      PrevClaim.Claim_Creation_Date DESC, 
      PrevClaim.Repair_Completion_Date DESC, 
      PrevClaim.Claim_Submitted_Date DESC 

编辑:根据Mongus傍回答这是正确的SQL:

SELECT TOP (1) Claim.idData AS ClaimID, PrevClaim.idData AS PrevClaimID 
FROM tabData AS Claim INNER JOIN tabData AS PrevClaim 
     ON Claim.SSN_Number = PrevClaim.SSN_Number 
     AND Claim.idData <> PrevClaim.idData 
     AND (Claim.Received_Date > PrevClaim.Received_Date 
     OR Claim.Received_Date = PrevClaim.Received_Date AND Claim.Claim_Creation_Date > PrevClaim.Claim_Creation_Date 
     OR Claim.Received_Date = PrevClaim.Received_Date AND Claim.Claim_Creation_Date = PrevClaim.Claim_Creation_Date AND Claim.Repair_Completion_Date > PrevClaim.Repair_Completion_Date 
     OR Claim.Received_Date = PrevClaim.Received_Date AND Claim.Claim_Creation_Date = PrevClaim.Claim_Creation_Date AND Claim.Repair_Completion_Date = PrevClaim.Repair_Completion_Date AND Claim.Claim_Submitted_Date > PrevClaim.Claim_Submitted_Date) 
WHERE (Claim.idData = @claimID) 
ORDER BY PrevClaim.Received_Date   DESC, 
     PrevClaim.Claim_Creation_Date DESC, 
     PrevClaim.Repair_Completion_Date DESC, 
     PrevClaim.Claim_Submitted_Date DESC 

回答

3

问题是如果这些日期中的任何一个比其他日期少,您将返回以前的记录。

两个记录至少有一个日期比另一个少,所以他们返回eachothers记录。

根据您指定的内容,你可能需要的东西,如:

Claim.Received_Date > PrevClaim.Received_Date OR 
(Claim.Received_Date = PrevClaim.Received_Date AND Claim.Claim_Creation_Date > PrevClaim.Claim_Creation_Date) OR 
(Claim.Received_Date = PrevClaim.Received_Date AND Claim.Claim_Creation_Date = PrevClaim.Claim_Creation_Date AND Claim.Repair_Completion_Date > PrevClaim.Repair_Completion_Date) OR 
(Claim.Received_Date = PrevClaim.Received_Date AND Claim.Claim_Creation_Date = PrevClaim.Claim_Creation_Date AND Claim.Repair_Completion_Date = PrevClaim.Repair_Completion_Date AND Claim.Claim_Submitted_Date > PrevClaim.Claim_Submitted_Date) 

它看起来可怕,但多数民众赞成SQL为您服务!

+0

谢谢。这是行得通的。我认为它一定是这样的,但我对此感到困惑:) – 2010-07-16 15:34:15

1

看起来你得到两个记录,因为

Claim.Repair_Completion_Date > PrevClaim.Repair_Completion_Date 

对于第二个是正确的,您的OR组中的其他三个子句对于第一个是正确的。

您可能不希望在完成日期进行比较;也许只是在另一个领域,像Claim_Submitted_Date?

+0

打不到一分钟:P – 2010-07-16 15:22:36

1

第一行有一个REPAIR_COMPLETION_DATE,比第二行早,这意味着它将满足JOIN条件Claim.Repair_Completion_Date > PrevClaim.Repair_Completion_Date,因此符合“先前”声明的条件。