2010-07-06 75 views
0

我有以下查詢,工作正常:SQL查詢永遠掛(8,0)字段

SELECT  TMP_CLPUD.dbo.FormatS(RIGHT(SV1.VASLOC, 7), 9, 0) AS C_ACCOUNT, 
     TMP_CLPUD.dbo.FormatS(Cust.C_CUSTOMER, 7, 0) AS C_CUSTOMER, 
     CA.OID, 
     CN2.NBCUNQ AS CUNQ, 
     CN2.NBSUNQ AS SUNQ, 
     'AC' AS C_STATUS, 
     TMP_CLPUD.dbo.mmsDATE(CN2.NBCNTE) AS IN_DATE, 
     TMP_CLPUD.dbo.mmsDATE(CN2.NBDSTE) AS OUT_DATE, 
     0 AS ARCHIVE 
FROM  BILLING.SVP00100 AS SV1 INNER JOIN BILLING.CNP00200 AS CN2 ON SV1.VASUNQ = CN2.NBSUNQ 
           INNER JOIN BILLING.CMP00100 AS CM1 ON CN2.NBCUNQ = CM1.KACUST 
           INNER JOIN BILLING.CustomerAccounts AS CA ON CM1.KACUST = CA.CustomerNbr 
           INNER JOIN TMP_CLPUD.dbo.tblCustomers As Cust ON CA.OID = Cust.OID 
           INNER JOIN BILLING.Customers AS C ON CA.OID = C.OID 
           INNER JOIN BILLING.CNP00100 AS CN1 ON CN2.NBCUNQ = CN1.NACUNQ AND CN2.NBSUNQ = CN1.NASUNQ 
ORDER BY C_ACCOUNT, C_CUSTOMER 

但是,如果我嘗試CN1和CN2之間多了一個場環節,查詢將無限期掛起。該字段在兩個表中都是十進制(8,0)類型,不允許爲空值。這裏是到位的第三鏈接查詢:

SELECT  TMP_CLPUD.dbo.FormatS(RIGHT(SV1.VASLOC, 7), 9, 0) AS C_ACCOUNT, 
     TMP_CLPUD.dbo.FormatS(Cust.C_CUSTOMER, 7, 0) AS C_CUSTOMER, 
     CA.OID, 
     CN2.NBCUNQ AS CUNQ, 
     CN2.NBSUNQ AS SUNQ, 
     'AC' AS C_STATUS, 
     TMP_CLPUD.dbo.mmsDATE(CN2.NBCNTE) AS IN_DATE, 
     TMP_CLPUD.dbo.mmsDATE(CN2.NBDSTE) AS OUT_DATE, 
     0 AS ARCHIVE 
FROM  BILLING.SVP00100 AS SV1 INNER JOIN BILLING.CNP00200 AS CN2 ON SV1.VASUNQ = CN2.NBSUNQ 
           INNER JOIN BILLING.CMP00100 AS CM1 ON CN2.NBCUNQ = CM1.KACUST 
           INNER JOIN BILLING.CustomerAccounts AS CA ON CM1.KACUST = CA.CustomerNbr 
           INNER JOIN TMP_CLPUD.dbo.tblCustomers As Cust ON CA.OID = Cust.OID 
           INNER JOIN BILLING.Customers AS C ON CA.OID = C.OID 
           INNER JOIN BILLING.CNP00100 AS CN1 ON CN2.NBCUNQ = CN1.NACUNQ AND CN2.NBSUNQ = CN1.NASUNQ AND CN2.NBCNTE = CN1.NACNTE 
ORDER BY C_ACCOUNT, C_CUSTOMER 

我已經重寫這個事情很多不同的方式,我能想到的,但每一次我嘗試它只是掛起永遠是第三場聯繫起來。有什麼建議麼?

+3

那麼今天我們學習如何使用浮點類型(無論如何精確)作爲連接鍵? – 2010-07-06 14:21:20

回答

1

如果您要比較完全匹配的浮點數,通常會遇到麻煩。克服這個問題的一種方法是取兩個數的差值的絕對值並將其與一個ε比較,比如1e-9,如果差值小於或等於這個ε,那麼你可以假設2個浮動值點數相等。

編輯 正如Lasse指出的那樣,嘗試使用上述技術加入這些列將會是一團糟。如果你真的需要這種連接能力,另一種方法是不將數字存儲爲浮點數,而是將它們存儲爲整數。因此,例如,如果它是美元貨幣,則可以將12345美元存儲爲12345. $ 99.01將存儲爲9901.然後,您可以加入整數值,這樣可以避免所有令人頭疼的浮點數。要將整數數字轉換回相應的浮點值,您只需除以某個常數(以美元貨幣示例爲100)。

但我會質疑你爲什麼加入這些類型的值,它似乎有點奇怪。

+0

哪一個工作奇蹟加入。你可以說交叉連接比較(注意,不是批評你的答案,只是觀察這個問題在這裏:)) – 2010-07-06 14:25:44

+0

@Lasse V. Karsen - 是的,我發佈我的答案後想到這個問題,並沒有'確定一個加入他們的好方法,所以我同意你的觀點:)。我想這種技術在編程競賽中工作得很好,但與SQL連接不太相關;)。 – dcp 2010-07-06 14:28:29

+0

我同意,它*是比較浮點值的「正確」方式。這裏的問題是加入浮點值的整個概念。有一個原因,它從來沒有完成。雖然很好的答案,懷疑它有助於OP,但是我再次懷疑在這種情況下會有什麼:) – 2010-07-06 14:30:36

0

平等總是與浮點數粗略。如果你代表的是類似貨幣交易的東西,你通常最好將它們存儲爲整數類型,比如美分(或者十分之一美分,或者任何你願意處理的最小硬幣)。