具有选择连接问题的TSQL更新

时间:2017-01-23 19:47:06

标签: sql-server tsql

我拿了一些应该工作的代码,看到它不能像设计那样工作, 我坦率地努力解决问题,我需要填补所有篮子,但现在只有第一次填补,我需要做任何支点吗?或者用select来摆脱更新?我喜欢拥有相同的5个Tx行,并为所有TxID填充所有篮子,下面的这个自包含示例将说明这一点:

 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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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