2011-09-06 193 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

相关问题