【问题标题】:Select data from one table where a field is greater than that of another field in another table从一个表中选择一个字段大于另一个表中另一个字段的数据
【发布时间】:2011-09-06 14:25:15
【问题描述】:

我希望能够从 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 更大的行。

干杯:)

【问题讨论】:

  • 那为什么不起作用呢?你遇到了什么错误?
  • 您向我们展示的查询是否无效?
  • 不,它不工作,它返回所有数据,而不仅仅是 Field1 更大的行。
  • 为 PK、FK Field1 和 Field2 字段提供一些示例数据。否则,请查看您在 field1 和 field2 之间的数据类型,它们是否兼容?您是否从 int 隐式转换为 varchar 使事情排序 funny
  • 已更新。如果您需要更多,请告诉我,干杯

标签: sql-server tsql select where-clause


【解决方案1】:

此演示代码似乎可以正常工作。也许我不理解问题或数据。

;
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

【讨论】:

  • 再次运行测试,比较 CAST('2004102881010' as varchar(50)) 和 CAST('9' as varchar(50))
  • 我为什么要进行这样的比较? OP 没有提供数据来表明 Field1/Field2 的短值是一个问题。但我确实同意字符串比较很可能是我上面评论中提到的问题,关于排序有趣的事情
  • Re: 我为什么要进行这种比较...因为您编写的演示代码会在 '2004102881010' 之后排序 '9' (因为它正在进行字符串比较,不是数字比较)。我认为 OP 正在寻找数字比较。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    用于字符串(varchars、nvarchars 等)的比较运算符(>、 '11' 为真。您可以尝试进行数据类型转换...

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

    【讨论】:

    • @PDB -- 请提供一个示例数据集(具体来说,返回的数据不应该返回。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    相关资源
    最近更新 更多