【问题标题】:Using RTRIM in JOIN condition在 JOIN 条件下使用 RTRIM
【发布时间】:2011-11-16 09:25:43
【问题描述】:

我想将两个包含产品的表按它们的描述放在一起

TABLE 1: [..fields..] [DESCRIPTION1] [..fields..]

TABLE 2: [..fields..] [DESCRIPTION2] [..fields..]

SELECT [..fields..] FROM TABLE1,TABLE2 
    INNER JOIN TABLE1 
    ON TABLE1.DESCRIPTION1 = TABLE2.DESCRIPTION2

但在很多情况下,两个表中都有以空格结尾的描述,我也想得到它们,所以我尝试了这种方式:

SELECT [..fields..] FROM TABLE1,TABLE2 
    INNER JOIN TABLE1 
    ON TABLE1.DESCRIPTION1 = TABLE2.DESCRIPTION2 
    OR RTRIM(TABLE1.DESCRIPTION1) = RTRIM(TABLE2.DESCRIPTION2)

不会产生错误,但不会带来更多数据。

有人能帮帮我吗?

感谢每一个帮助:)

提前致谢,哈利

【问题讨论】:

  • 你怎么知道问题是尾随空格?两个描述列的数据类型是什么?还有你真的要写FROM table1, table2 INNER JOIN table1吗?
  • 两者都是varchar,我知道是因为有空格,因为我在TABLE1中发现了很多以空格结尾的描述:|
  • FROM table1, table2 INNER JOIN table1 是 Microsoft SQL Server Manager 生成的代码,有没有更简单的方法?
  • 仅仅因为有空格并不意味着这就是您的联接不返回任何行的原因。特别是因为删除所有尾随空格的 RTRIM 并没有修复它。
  • 虽然我不会 100% 感到震惊,但我认为 Management Studio 不会自行生成该代码。你能解释一下你是如何得到它来产生老式内部连接的吗?

标签: sql sql-server sql-server-2005 select join


【解决方案1】:

问题可能是描述末尾的 CRLF 字符,它看起来像 SSMS 中的空格,不会被 RTRIM() 删除。

要检查,请查看选择 where Description like '%' + char(13) + char(10) 是否返回任何内容。如果描述末尾似乎只有 1 个空格,请单独尝试 char(13)char(10)。最后,Tab (char(9)) 也看起来像一个空格,所以你也可以试试。

如果确实是这些字符中的任何一个,您可以使用REPLACE 删除它们:

REPLACE(REPLACE(REPLACE(MyField, CHAR(10), ''), CHAR(13), ''), CHAR(9), '')

我找到了here

【讨论】:

  • 这看起来很有希望,并且可以解释为什么 LEN() 和 DATALEN() 存在差异,到目前为止,谢谢,我报告它是否解决了问题
  • 这真的很有帮助。将这些和描述中的空格结合起来就是问题所在。谢谢你和所有其他帮助我的人:)
【解决方案2】:

你不需要 OR

SELECT [..fields..] 
  FROM TABLE1 T1
       INNER JOIN TABLE2 T2
         ON RTRIM(T1.DESCRIPTION1) = RTRIM(T2.DESCRIPTION2)

【讨论】:

  • OR 在这里完全没问题。其原因是利用description 上的索引(当然,如果它存在的话)。
  • @a1ex07 - 你提出了一个有效的观点。在一次性转换的情况下,我通常不会关心性能,但如果表很大,这可能很重要,所以总是最好是安全的。
  • @Leons:我明白了;看起来它并不是我最初想的那样为了性能而刻意制作的。
【解决方案3】:

根据数据类型,您根本不需要 RTRIM()。我还想知道你的旧式和现代连接语法的混合是否会让你绊倒(尽管这应该产生更多的行,而不是更少)。这会产生什么?

SELECT [..columns..]
    FROM dbo.TABLE1 AS t1
    INNER JOIN dbo.TABLE2 AS t2
    ON RTRIM(t1.DESCRIPTION1) = RTRIM(t2.DESCRIPTION2);

【讨论】:

  • 无论是修复特定问题还是不混合隐式和显式连接都会产生问题,不应该这样做。近 20 年的时间还不足以忍受人们使用这种很久以前被替换的语法吗?我们不能弃用它并完成它吗?
  • @HLGEM 旧式内部连接仍然没有被弃用(就像你一样,我希望他们已经把它们扔掉了)。只有旧式外连接 (*=/=*) 最终不起作用。因此,您仍然可以随心所欲地不断生成无意的笛卡尔积! :-)
猜你喜欢
  • 2011-09-02
  • 2021-01-11
  • 2014-05-03
  • 2021-01-10
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-15
相关资源
最近更新 更多