2011-09-06 233 views
0

我希望能夠從TableA中選擇數據,其中Field1大於TableB中的Field2。從一個表中選擇數據的字段大於另一個表中另一個字段的數據

在我的腦子裏,我像它是這樣的

Select TableA.* 
    from TableA 
    Join TableB 
    On TableA.PK = TableB.FK 

    WHERE TableA.Field1 > TableB.Field2 

我使用SQL Server 2005和TableA.Field1和tableB.Field2樣子:

2004102881010 - data type - Vrachar 

我的PK和FK看起來像:

0908232  - data type - nvarchar 

該probelm是什麼時候這個查詢運行所有的數據顯示,而不僅僅是e行Field1更大。

乾杯:)

+1

那麼爲什麼不工作?你遇到什麼錯誤? – billinkc

+0

您向我們顯示的查詢不起作用? –

+0

不工作,它返回所有的數據,而不僅僅是Field1更大的行。 – PDB

回答

0

似乎這個演示代碼正常工作。也許我不理解問題或數據。

; 
with TABLEA (PK, Field1) AS 
(

    -- Sample row that is filtered out 
    SELECT CAST('0908232' AS nvarchar(10)), CAST('2004102881010' AS varchar(50)) 
    -- This is bigger than what's in B 
    UNION ALL SELECT CAST('0908232' AS nvarchar(10)), CAST('2005102881010' AS varchar(50)) 
) 
, TABLEB(FK, Field2) AS 
(
    -- This matches row 1 above and will be excluded 
    SELECT CAST('0908232' AS nvarchar(10)), CAST('2004102881010' AS varchar(50)) 
) 
SELECT TableA.* 
FROM TableA 
INNER JOIN TableB 
ON TableA.PK = TableB.FK 
WHERE TableA.Field1 > TableB.Field2 

結果

PK  Field1 
0908232 2005102881010 
+0

再次用CAST('9'作爲varchar(50))比較CAST('2004102881010'as varchar(50)) – Chains

+0

爲什麼要進行比較? OP沒有提供數據來表明Field1/Field2的短值是一個問題。但我同意字符串比較最有可能的問題,正如我在上面的評論中指出的那樣,排序有趣的事情 – billinkc

+0

回覆:爲什麼我會進行比較...因爲你寫的演示代碼會在*之後排序'9'* '2004102881010'(因爲它正在進行字符串比較,而不是數字比較)。我認爲OP正在尋找一個數字比較。 – Chains

0

這似乎就像缺了零一個問題: 20041028 * * 81010

沒有什麼不對您的查詢,但您的數據。 考慮2001-01-01 1點01分01秒,這將被看作是:200111111 它應該被看作是:對字符串使用20010101010101個

0

Comparrison運營商(>,<)(VARCHAR處理,nvarchars等)按字母順序工作。例如,'9'>'11'是真的。你可以嘗試做一個數據類型轉換...

WHERE cast(A.field1 as int) > cast(B.field2 as int) 
+0

仍然返回所有數據 – PDB

+0

@PDB - 請提供一個樣本數據集(具體而言,返回的數據*不應該*返回。 – Chains

相關問題