Sql server 从一个表中选择一个字段大于另一个表中另一个字段的数据

Sql server 从一个表中选择一个字段大于另一个表中另一个字段的数据,sql-server,tsql,select,where-clause,Sql Server,Tsql,Select,Where Clause,我希望能够从表A中选择数据,其中表B中的字段1大于字段2 在我的脑海里,我想象它是这样的 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 typ

我希望能够从表A中选择数据,其中表B中的字段1大于字段2

在我的脑海里,我想象它是这样的

    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 
0908232      - data type - nvarchar
我的PK和FK看起来像:

2004102881010 - data type - Vrachar 
0908232      - data type - nvarchar
问题是,当运行此查询时,所有数据都将显示,而不仅仅是Field1较大的行


干杯:

对于此演示代码来说似乎工作正常。也许我不了解问题或数据

;
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

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

您的查询没有问题,但是您的数据有问题。 考虑到2001年01月01日01∶01∶01,这将被视为:200111111。 应将其视为:20010101010101

比较运算符>,“11”为真。您可以尝试执行数据类型转换

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

那为什么不起作用呢?您遇到了什么错误?您向我们显示的查询是否不起作用?不,它不起作用,它返回所有数据,而不仅仅是字段1较大的行。然后为PK、FK字段1和字段2字段提供一些示例数据。否则,请查看field1和field2之间的数据类型,它们是否兼容?您是否正在从int得到一个到varchar的隐式转换,使事情排序变得有趣。让我知道如果您需要更多,干杯再次运行您的测试,将演员'2004102881010'作为varchar50与演员'9'作为varchar50进行比较我为什么要进行这种比较?OP没有提供数据表明Field1/Field2的短值是一个问题。但我同意字符串比较很可能是我在上面关于排序funnyRe的评论中提到的问题:我为什么要进行这种比较……因为您编写的演示代码将在“2004102881010”之后排序“9”,因为它是在进行字符串比较,而不是数字比较。我认为OP正在寻找一个数字比较。@PDB-请提供一个示例数据集,特别是返回的数据,不应该返回的数据。