2016-04-08 13 views
0

Msg 156, Ebene 15, Status 1, Zeile 8 falsche Syntax nahe dem Schlüsselwort ‚CASE‘Case-Spalten zu verbinden

Ich versuche Spalten auf dem Spaltenwert zu verbinden basieren.

Wenn Fall conditon 1 wahr ist, dann will ich ON im.ItemNumber = left (tr.itemnumber, len (tr.itemnumber) -4)

wenn Fall Bedingung wahr 2 ist dann

beitreten

ON tr.ItemNumber = im.LegacyItemNumber

sonst

tr.ItemNumber = im.ItemNumber

SELECT 
      im.Category as RootCategory,GETDATE() AS LoadDate,tr.* 
      into transactionreport_stage_testNN 
    FROM transaction tr 
    LEFT OUTER JOIN ALLDW_ora.dbo.Location(NOLOCK) loc ON tr.location=loc.location 

    CASE 
    when 
    right(tr.itemnumber,4) = '_old' then 
    LEFT OUTER JOIN [Inventory](NOLOCK) im 
    ON im.ItemNumber = left(tr.itemnumber,len(tr.itemnumber)-4) 


    when 
    tr.itemnumber <> im.ItemNumber 
    then 
    LEFT OUTER JOIN [Inventory](NOLOCK) im 
    ON tr.ItemNumber = im.LegacyItemNumber 

else 
LEFT OUTER JOIN [Inventory](NOLOCK) im 
ON tr.ItemNumber = im.itemnumber 

    end 

    AND im.Location=loc.LocationNo 

Schema

+0

[Dies] (http://stackoverflow.com/questions/ 10256848/can-i-Use-case-Anweisung-in-einem-Join-Bedingung/10260297 # 10260297) Antwort kann eine Hilfe sein. Sie können die Übereinstimmungsbedingung in einem "Fall" jonglieren, aber andere Teile der Abfrage, z. Tische, Willy Nilly. Sie können immer noch alles beitreten und versuchen, es in einem "wo" zu sortieren, aber da kommt ein Punkt, wo die Dinge außer Kontrolle geraten. – HABO

+0

Bitte beachten Sie auch, dass solche bedingten Joins keine empfohlene Option sind und fast immer durch andere Ansätze wie Union ersetzt werden können. Sql funktioniert sehr gut in Set-based Operationen, jeder strukturelle Code wird schlechter funktionieren. Eine solche konditionale Logik kann als ... sonst gesehen werden. Bitte überprüfen Sie diesen Artikel: https://www.simple-talk.com/sql/performance/how-to-avoid-conditional-joins-in-t-sql/ zum Beispiel. Sie finden mehr im Internet. –

Antwort

0

sollten Sie wahrscheinlich nur UND die Nutzung

des OR
LEFT OUTER JOIN [Inventory](NOLOCK) im ON im.Location=loc.LocationNo 
     AND (
      (right(tr.itemnumber,4) = '_old' AND im.ItemNumber = left(tr.itemnumber,len(tr.itemnumber)-4)) 
      OR 
      (tr.itemnumber <> im.ItemNumber AND tr.ItemNumber = im.LegacyItemNumber) 
      OR 
      (tr.ItemNumber = im.itemnumber)   
     ) 

es genauso einfach sein wie

SELECT im.Category AS RootCategory, 
     GETDATE() AS LoadDate, 
     tr.* 
INTO #transactionreport_stage_testNN 
FROM [transaction] tr 
     LEFT OUTER JOIN ALLDW_ora.dbo.Location (NOLOCK) loc ON tr.location = loc.location 
     LEFT OUTER JOIN [Inventory] (NOLOCK) im ON im.Location = loc.LocationNo 
      AND REPLACE(tr.itemnumber, '_old', '') IN (im.itemnumber, im.legacyitemnumber) 
+0

Hey, Danke für die schnelle Antwort. Ich habe den Code geändert. – neoo

+0

Ich habe drei Bedingungen, Wenn es Bedingungen gibt, was Sie gesagt haben, ist richtig. Aber ich brauche andere Spalte für die eine die Bedingung – neoo

+0

oh ich sehe, was Sie jetzt sagen .. nur eine Sekunde – JamieD77