【问题标题】:Left Join vs. Inner Join causing different results when using Substring/Left functions使用 Substring/Left 函数时,Left Join 与 Inner Join 导致不同的结果
【发布时间】:2017-11-17 02:28:17
【问题描述】:

谁能解释一下为什么下面的查询会返回一个结果集:

SELECT sub.*, xr.*
FROM (
    select  rc.CommentID,
            [CreateDate] = LEFT(rc.Comments, 10),
            [CreatedBy] = SUBSTRING(rc.Comments, 12, CHARINDEX(':', rc.Comments) - 12),
            src.Comments
    from dbo.RequestComments rc
    where rc.CommentID NOT IN( 4290, 4289, 4221)
) sub
LEFT JOIN dbo.SWDBCWUserXRef xr
 ON sub.CreatedBy = xr.EnteredByName

...但是,如果我将其修改为使用 INNER JOIN 而不是 LEFT JOIN:

SELECT sub.*, xr.*
FROM (
    select  rc.CommentID,
            [CreateDate] = LEFT(rc.Comments, 10),
            [CreatedBy] = SUBSTRING(rc.Comments, 12, CHARINDEX(':', rc.Comments) - 12),
            src.Comments
    from dbo.RequestComments rc
    where rc.CommentID NOT IN( 4290, 4289, 4221)
) sub
JOIN dbo.SWDBCWUserXRef xr
 ON sub.CreatedBy = xr.EnteredByName 

我收到以下错误:

Msg 537, Level 16, State 3, Line 3
Invalid length parameter passed to the LEFT or SUBSTRING function.

谢谢。

【问题讨论】:

  • 可能是因为您在 SUBSTRING...CHARINDEX(... 产生负值的 INNER JOIN 中获得了更多记录。
  • 如果这是整个查询,我很难相信您会这样做。当你不使用common-table-expression时,为什么要标记?你能发布一个重现问题的脚本吗?最可能的解释:问题出现在您没有向我们展示的代码的某些部分。
  • 最有可能编译器在不考虑 NOT IN 的情况下首先处理连接,导致一些 CreatedBy 为 NULL / -1 等。也许考虑一个 CTE(可能做同样的事情),或者一个 temptable/子查询的表变量。
  • @mjw 如何从 LEFT JOIN 更改为 INNER JOIN 导致更多记录?以及外部查询中的JOIN类型如何影响单表子查询中的LEFT()或SUBSTRING()?
  • 用任何东西替换你的 SUBSTRING 表达式......比如说,'TEST',看看你是否仍然得到同样的错误。猜测您在 rc.Comments 列中有一些您不期望的数据。

标签: sql tsql substring


【解决方案1】:
SELECT sub.*, xr.*
FROM (
select  rc.CommentID,
[CreateDate] = LEFT(rc.Comments, 10),
[CreatedBy] = SUBSTRING(rc.Comments, 12, CHARINDEX(':', rc.Comments) - 12),
src.Comments
from dbo.RequestComments rc
where rc.CommentID NOT IN( 4290, 4289, 4221)
) sub
JOIN dbo.SWDBCWUserXRef xr
 ON SUBSTRING(rc.Comments, 12, CHARINDEX(':', rc.Comments) =    xr.EnteredByName 

【讨论】:

    猜你喜欢
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2021-06-25
    • 2023-03-17
    • 2012-08-17
    • 1970-01-01
    • 2018-07-10
    相关资源
    最近更新 更多