0

データベースに書き込んでいる特定のクエリについて質問がありSQL Server 2008ます。これは(はるかに)大きなクエリの一部ですが、私がやろうとしていることを簡単に分離できるように、それを単純化していきます。

私はテーブルTableX、2つの列を持っています:

  • IDX (int) identity
  • VarX (varchar(20))

2つの補助テーブルがTableYありTableZます。どちらにも2つの列があります。

TableY
  • IDY (int) identity

  • VarY (varchar(20))

    TableZ

  • IDZ (int) identity

  • VarZ (varchar(20))

私は4番目のテーブルに挿入を行っています。これをと呼びますTableATableA3つの列があります:

  • IDA (int) identity
  • IDY (int)
  • IDZ (int)

この表のIDYおよびIDZフィールドは、表Yおよび表ZのID列への外部キーです。

複雑に聞こえますが、接続は非常に簡単です。ここが楽しいところです。

したがって、のデータは次のTableXようになります。

IDX | VarX
--------------
1   | ABC
2   | ABC-LMN

のデータTableY

IDY | VarY
----------------
1   |ABC
2   | HIJ

のデータTableZ

IDZ | VarZ
----------------
1   | LMN
2   | OPQ

基本的に、VarX(2番目の列)は、単一のvarchar文字列、またはスペースなしでハイフンで接続された2つの文字列のいずれかになります。ハイフンのない単一の文字列の場合、常に表Yで一致します。一致はでオンVarYTableY = VarXなりTableXます。関連付けられたID()を取得し、IDYそれをの挿入で使用しTableAます。

行1の例では、への挿入は次のようにTableAなります。(null, 1, null)

行2の場合、ハイフンで区切られた2つの文字列があります。したがって、への挿入TableAは最終的にはになります(null, 1, 1)

だから私の質問はこれです...このタイプのロジックを処理するために、対応する結合を使用して挿入を定式化するにはどうすればよいですか?私はDBAではないので、caseステートメントである必要があります...完全なクエリを視覚化するのに多くの問題があります...どんな助けでもありがたいです。

4

2 に答える 2

2

これが含まれるprocがそれを必要としない限り、この動的SQLを作成する必要はありません。

INSERT INTO TableA (IDY,IDZ)
SELECT ty.IDY, tz.IDZ
FROM TableX tx
LEFT JOIN TableY ty ON ty.VarY =
   (CASE WHEN CHARINDEX('-', tx.VarX) = 0 THEN tx.VarX
   ELSE LEFT(tx.VarX, CHARINDEX('-', tx.VarX) - 1) END)
LEFT JOIN TableZ tz ON tz.VarZ =
   CASE WHEN CHARINDEX('-', tx.VarX) = 0 THEN NULL
   ELSE RIGHT(tx.VarX, LEN(tx.VarX) - CHARINDEX('-', tx.VarX)) END

TableA.IDAアイデンティティ列にNULLを挿入しようとする理由がわからないため、またはそれが可能かどうかさえわからないため、意図的にNULLの挿入を省略しました。また、のデータには、、、などのVarX縮退したケースはないと仮定しました。'-''ZXC-''ASD-BNM '

于 2012-07-06T19:58:35.617 に答える
1

私はそれを変更しました、それはこれに単純化できるようです:

DECLARE @x TABLE (IDX INT, VarX VARCHAR(20))
INSERT @x VALUES (1, 'ABC'), (2, 'ABC-LMN')

DECLARE @y TABLE (IDY INT, VarY VARCHAR(20))
INSERT @y VALUES (1, 'ABC'), (2, 'HIJ')

DECLARE @z TABLE (IDZ INT, VarZ VARCHAR(20))
INSERT @z VALUES (1, 'LMN'), (2, 'OPQ') 

DECLARE @a TABLE (IDA INT IDENTITY(1, 1), IDY INT, IDZ INT)

INSERT      @a
SELECT      y.IDY,
            z.IDZ
FROM        @x x
LEFT JOIN   @y y ON y.VarY = LEFT(x.VarX, LEN(y.VarY))
LEFT JOIN   @z z ON z.VarZ = RIGHT(x.VarX, LEN(z.VarZ)) AND CHARINDEX('-', x.VarX) <> 0

 SELECT  *
 FROM    @a
于 2012-07-06T19:52:40.267 に答える