2017-03-24 17 views
-1

私はテストの証明としてテーブルとレポートテーブルを比較しようとしています。レポートテーブルには12文字のIDとDOBがあり、ソーステーブルにはIDのみが含まれています。sqlはcharをintに変換しますか?

select cast(ID as char(12)) as ID into #IDnums 
from members 
where client='some_client' 

select ID 
from #IDnums 
where ID not in (
    select left(12,rtrim(ltrim(memberID))) 
    from report_table 
    ) 

memberIDはchar(50)フィールドです。私はこれを実行すると、私はエラーを取得する:

The conversion of the varchar value '74857358238119880131' overflowed an int column.

私はvarchar型またはint型から、またはどのようにこの問題を解決するに来る見当がつかない。

+1

タグ、使用しているDBMSを。いくつかの非ANSI SQLがあります... – jarlh

+3

よく、あなたは 'LEFT'を間違って使用しています、それは最初に文字列であると思われ、後で長さ:' left(rtrim(ltrim(memberID))、12) ' – Lamak

答えて

2

left()を使用すると、最初の引数は文字列で、2番目の引数は長さです。

したがって、memberidの式を整数として解釈しています。それが変換に失敗した場所です。あなたが欲しい:

select ID 
from #IDnums 
where ID not in (select left(rtrim(ltrim(memberID)), 12) from report_table); 

は、私はそれサブクエリでnot inを使用するには、悪い習慣を検討してください。問題は、memberIdがいつでもNULLになるとどうなるかです。その場合、not inは行をまったく返しません。だから私は代わりにnot existsを使用することをお勧めします。

一時テーブルを使用している理由もわかりません。これは、あなたがやりたいん:

select id 
from members m 
where not exists (select 1 
        from report_table rt 
        where left(rt.memberId, 12) = cast(m.id as varchar(12)) 
       ); 

か:

select id 
from members m 
where not exists (select 1 
        from report_table rt 
        where rt.memberId like concat(m.id, '%') 
       ); 
関連する問題