2017-01-23 60 views
1

我花了一些代碼,這應該是工作和看到的desinged它不工作,我 坦率地掙扎着爬什麼是錯的,我需要填寫的所有籃筐,但現在只有第一次得到填補,我是否需要做任何支點?或通過選擇擺脫更新? 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 
+0

引人入勝。它可能是未定義的(或不確定的)行爲。嘗試用'RIGHT JOIN'替換更新語句的'JOIN',看看會發生什麼。你可以用子查詢重寫'CASE'東西到'#lkup'嗎? – dlatikay

+0

Tx我嘗試使用(選擇)括號而不是案例,它並沒有採取它,可能b'z UPDATE語法。與RIGHT JOIN它現在捕獲Prod1和Prod3,但仍然不是Prod2(?)。 –

+0

更正:這實際上有效,但將是我最後的手段,我也有人y籃子,並在真正的設置我嵌套選擇JOIN。 UPDATE #tx SET#tx.Prod1 = –

回答

0

您可以使用此代碼塊。

UPDATE tx 
SET Prod1 = l.ProductID, 
     Prod2 = l2.ProductID, 
     Prod3 = l3.ProductID 
--- SELECT l.Line, l.ProductID, tx.* 
FROM #tx tx 
LEFT JOIN #lkup l ON l.Cust_ID = tx.Cust_ID AND l.Line=1 
LEFT JOIN #lkup l2 ON l2.Cust_ID = tx.Cust_ID AND l2.Line=2 
LEFT JOIN #lkup l3 ON l3.Cust_ID = tx.Cust_ID AND l3.Line=3 
0

問題當然是你要多次更新同一行。這是奇怪的是,它不是一個錯誤,但如果我理解正確的代碼,你可以做這樣的事情:

UPDATE tx 
SET tx.Prod1 = L.Prod1, 
    tx.Prod2 = L.Prod2, 
    tx.Prod3 = L.Prod3 
FROM #tx tx 
cross apply (
    SELECT 
     Cust_ID, 
     Prod1 = max(CASE WHEN LINE =1 THEN ProductID END), 
     Prod2 = max(CASE WHEN LINE =2 THEN ProductID END), 
     Prod3 = max(CASE WHEN LINE =3 THEN ProductID END) 
    FROM #lkup 
    group by Cust_ID 
) L where L.Cust_ID = tx.Cust_ID 

結果:

   Cust_ID Prod1 Prod2 Prod3 TxID 
1 201  Pr1  Pr20 Pr333 12001 
2 201  Pr1  Pr20 Pr333 12002 
3 201  Pr1  Pr20 Pr333 12003 
4 201  Pr1  Pr20 Pr333 12004 
5 201  Pr1  Pr20 Pr333 12005