私は動作するはずのコードを取って、それはdesingedとして動作しません、 私は間違っていることを率直に苦労して、私はすべてのバスケットを埋める必要が、 、私はピボットを行う必要がありますか?またはselectを使って更新を取り除く? Id'like同じ5つのTxの行を持っている、とALLのTxID、以下、この自己包括例えば、すべてのバスケットを埋めるためには、このことを説明します:選択参加問題のTSQL更新
SELECT * INTO #lkup FROM ( -- drop table #lkup -- select * from #lkup
SELECT 201 Cust_ID, 1 Line, 'Pr1' ProductID UNION
SELECT 201 Cust_ID, 2 Line, 'Pr20' ProductID UNION
SELECT 201 Cust_ID, 3 Line, 'Pr333' ProductID ) g
SELECT * INTO #tx FROM ( -- drop table #tx -- select * from #tx
SELECT 201 Cust_ID, cast (NULL AS varchar(7)) Prod1, cast (NULL AS varchar(7)) Prod2, cast (NULL AS varchar(7)) Prod3 , 12001 TxID UNION
SELECT 201 Cust_ID, cast (NULL AS varchar(7)) Prod1, cast (NULL AS varchar(7)) Prod2, cast (NULL AS varchar(7)) Prod3 , 12002 TxID UNION
SELECT 201 Cust_ID, cast (NULL AS varchar(7)) Prod1, cast (NULL AS varchar(7)) Prod2, cast (NULL AS varchar(7)) Prod3 , 12003 TxID UNION
SELECT 201 Cust_ID, cast (NULL AS varchar(7)) Prod1, cast (NULL AS varchar(7)) Prod2, cast (NULL AS varchar(7)) Prod3 , 12004 TxID UNION
SELECT 201 Cust_ID, cast (NULL AS varchar(7)) Prod1, cast (NULL AS varchar(7)) Prod2, cast (NULL AS varchar(7)) Prod3 , 12005 TxID ) g
UPDATE tx
SET Prod1 = CASE WHEN LINE =1 THEN ProductID END,
Prod2 = CASE WHEN LINE =2 THEN ProductID END,
Prod3 = CASE WHEN LINE =3 THEN ProductID END
--- SELECT l.Line, l.ProductID, tx.*
FROM #tx tx
JOIN #lkup l ON l.Cust_ID = tx.Cust_ID
SELECT * FROM #tx -- update #tx set Prod1 = ' ', Prod2 = ' ', Prod3 = ' '
SELECT 'Shouldbe' , '201' CustID, 'Pr1' Prod1, 'Pr20' Prod1, 'Pr333' Prod1, 12001 TxID -- for each Tx 5 rows Total
魅力的。おそらく未定義の(または不確定な)動作です。更新ステートメントの 'JOIN'を' RIGHT JOIN'で置き換え、何が起こるかを見てみましょう。サブクエリを '#lkup'に' CASE'のものを書き換えることができますか? – dlatikay
Tx私は、Caseの代わりに括弧で(選択)を使用しようとしましたが、おそらくはUPDATE構文のb'zです。右ジョインではProd1とProd3をキャプチャしますが、まだProd2(?)はキャプチャしていません。 –
訂正:これは実際には機能しますが、私の最後の手段になります。私はバスケットがあまりにも多く、実際のセットアップではJOINに入れ子になっています。 UPDATE #tx SET#tx.Prod1 =(SELECT l.ProductID FROM #lkup l WHERE l.Cust_ID =#tx.Cust_ID AND LINE = 1) –