2017-01-23 2 views
1

Ich nahm etwas Code, der funktionieren sollte und sehen es funktioniert nicht als desinged, Ich ehrlich gesagt kämpfen, um zu bekommen, was falsch ist, muss ich alle Korb füllen, aber jetzt erst erst gefüllt Muss ich irgendeinen Drehpunkt machen? oder loswerden von update mit select? Id'like haben gleiche 5 Tx Reihen, und füllen Sie alle Korb für ALLE TxID, diese Selbst inklusive Beispiel unten wird dies veranschaulichen:TSQL-Update mit Select-Join-Problem

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

faszinierend. es ist wahrscheinlich undefiniertes (oder unbestimmtes) Verhalten. Versuchen Sie, die 'JOIN' der update-Anweisung durch' RIGHT JOIN' zu ersetzen und sehen Sie, was passiert. Könntest du einfach das 'CASE'-Zeug mit Unterabfragen zu' # lkup' umschreiben? – dlatikay

+0

Tx Ich versuchte verwenden (Select) in Klammern statt Case und es dauert nicht, wahrscheinlich b'z der UPDATE-Syntax. mit RIGHT JOIN fängt es jetzt Prod1 UND Prod3 ein, aber immer noch nicht Prod2 (?). –

+0

Korrektur: das funktioniert tatsächlich, aber wäre mein letzter Ausweg, ich habe auch man y Körbe und in Real-Setup habe ich in JOIN Select geschachtelt. UPDATE #tx SET # tx.Prod1 = (SELECT l.ProduktID FROM #lkup l WHERE l.Cust_ID = # tx.Cust_ID UND LINE = 1) –

Antwort

0

Sie können diesen Codeblock verwenden.

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

Das Problem ist natürlich, dass Sie die gleichen Zeilen mehr als einmal aktualisieren. Es ist seltsam, dass es nicht ein Fehler ist, aber wenn ich den Code richtig verstanden, könnten Sie so etwas tun:

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 

Ergebnis:

   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