2017-06-14 4 views
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 
LEFT JOIN dbo.SWDBCWUserXRef xr 
ON sub.CreatedBy = xr.EnteredByName 

を...しかし、私はそれを変更した場合INNERが代わりにLEFT JOINを使用のは、JOIN:

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

ありがとう:

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 

は、私は、次のエラーメッセージが表示されます。

+1

多分あなたはSUBSTRING ... CHARINDEX(...が負の値を生産しているところINNERで複数のレコードを登録しよ取得しているため。 – mjw

+1

これがあれば、私は、それは難しいあなたが行うことを信じることを見つけますなぜあなたは 'common-table-expression'にタグをつけていませんでしたか?問題を再現するスクリプトを投稿できますか?ほとんどの可能性が高い説明:あなたが表示していないコードの一部で問題が発生しています私たち –

+2

ほとんどの場合、コンパイラはNOT INを考慮せずに結合を最初に処理しているため、CreatedByがNULL/-1などになることがあります。CTE(同じこともあります)、またはサブクエリの誘惑性/テーブル変数を考えてください。 –

答えて

0
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 
関連する問題