2017-07-06 5 views
1

私はSQLを使い始めました。ここで私はあなたの多くのために簡単だと確信している操作です。 dbBとdbA、TableA(IdAの場合)とTableB(IdBの場合)の2つのテーブルを同じサーバー上のデータベースにまたがって結合しようとしています。しかし、それを行う前に、列番号IdAを数値に変換したいところで、その値から ":XYZ"文字を削除し、dbAの別の列にwhereステートメントを追加したいと考えています。以下では、結合のコードを示しますが、列の値を変換する方法がわかりません。これにより、私はidAidBを結合して一致させることができます。ありがとうございました。SQLトランスフォームのIDとadd where文の前にjoin

Select replace(idA, “:XYZ”, "") 
from dbA.TableA guid 
where event like “%2015” 
left join dbB.TableB own 
on guid.idA = own.idB 
+1

あなたは上の置き換えたい参加する前に、その変形状態でIDAので、サブクエリを使用して最初の変換を実体(の)(のような代数の問題をアウト内部で処理GET)結合の前に置換された値が存在するように、結合またはサブクエリを使用する必要があります。 – xQbert

答えて

4
(あなたはサブクエリを使用しない限り)、構文の順序が、それはまた、実行の順序です(予告の選択は、操作のために、その端に近いとしてリストされていない

いくつ

  1. FROMを、参加、しかし、最初は構文的に!)
  2. 複数のテーブルが関わっているときにエイリアス/完全に修飾すると、どのフィールドがどのテーブルから来るのかが分かります。
  3. 操作の順序がSQLからのJOINS 1stを実行しているため、selectで何を行うのかはまだコンパイラーにとって有効ではありません(これはまだ有効ではありません)。どこでグループ化するか、グループ化することもできます。
  4. Select *が好きではありませんが、本当に必要な列がわからないので、ここで使用しました。
  5. ジョインの前のどこまで。ほとんどのSQLコンパイラはコストベースの最適化を使用して、データテーブルとそれに関係しないものを考慮して最適な実行計画を見つけ出します。したがって、左の結合の左のテーブルを制限しているので、この場合はどこに制限基準を置いてください。左結合の右表のデータを制限する必要がある場合は、結合基準に制限を設定します。したがって、それが結合するときにフィルタリングすることが可能になる。
  6. は、おそらく私がスペースを排除するためにトリムを使用(またはIDBと同じタイプに)整数としてIDAをキャストする必要がありますが、他の非表示文字がある場合は、左の問題参加マッチング)
を持っていると思います

SELECT guild.*, own.* 
FROM dbA.TableA guid 
LEFT JOIN dbB.TableB own 
    on cast(trim(replace(guid.idA, ':XYZ', '')) as int) = own.idB 
WHERE guid.event like '%2015' 

それとも

SELECT * 
FROM (SELECT cast(trim(replace(guid.idA, ':XYZ', '')) as int) as idA 
     FROM dbA.TableA guid 
     WHERE guid.event like '%2015') B 
LEFT JOIN dbB.TableB own 
    on B.IDA = own.idB 
+0

ご返信いただきありがとうございました。私は両方を試して、交換部分の周りにエラーが出ます。なぜ今私は確信している。 – AlxRd

+0

IDAはtableAにありますか? IDAは '123:XYZ'のように見え、それは123のように見えますか?同じデータ型のIDAとIDBの両方ですか?最後に、特定のエラーとは何ですか?どのようなクエリですか? – xQbert

+0

guild.idaと自分自身のidbとデータに一致するものを提供できるかどうかを判断するにはどうすればいいですか? – xQbert