从一个表中选择数据,其中字段大于另一个表中另一个字段的字段

时间:2011-09-06 14:25:16

标签: sql-server tsql select where-clause

我希望能够从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

问题是当运行此查询时,所有数据都在显示,而不仅仅是Field1更大的行。

干杯:)

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这似乎是缺少零的问题: 20041028 * 0 * 81010

您的查询没有问题,但是您的数据。 考虑2001-01-01 01:01:01,这将被视为:200111111 它应该被视为:20010101010101

答案 2 :(得分:0)

字符串(varchar,nvarchar等)上使用的比较运算符(>,<)按字母顺序工作。例如,'9'> '11'是真的。您可以尝试进行数据类型转换...

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