2016-04-08 42 views
0

Msg 156, Düzey 15, State 1, satır 8 anahtar kelime 'HALİNDE'Vaka Durum Ben sütun değerine dayalı sütunları katılmaya çalışıyorum sütunları

yakınında yanlış sözdizimi katılmak.

vaka durumunun 1 doğruysa

sonra ben im.ItemNumber = sol AÇIK (tr.itemnumber, len (tr.itemnumber) -4)

Vaka koşul 2 gerçek ardından

ise katılmak isteyen AÇIK

tr.ItemNumber = im.LegacyItemNumber başka

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

[Bu] (http://stackoverflow.com/questions/ 10256848/can-i-use-case-in-a-join-condition/10260297 # 10260297) cevap bazı yardım olabilir. Eşleşme koşulunu bir 'case'de juggle edebilir, ancak sorgunun diğer bölümlerini değiştiremezsiniz, ör. masalar, nilly nilly. Yine de her şeye katılabilir ve onu bir '' '' 'olarak sıralamaya çalışabilirsiniz, fakat işlerin elden çıktığı bir noktaya varır. – HABO

+0

Ayrıca, bu tür koşullu birleştirmelerin önerilen bir seçenek olmadığına ve hemen hemen her zaman sendika gibi başka bir yaklaşımla değiştirilebileceğine dikkat edin. Sql set bazlı işlemlerde gerçekten harika performans gösteriyor, herhangi bir yapısal kod daha da kötüye gidiyor. Bu şartlı mantık, sanki ... gibi görülebilir. Lütfen şu makaleye göz atın: https://www.simple-talk.com/sql/performance/how-to-avoid-conditional-joins-in-t-sql/ Örneğin. İnternette daha çok bulacaksınız. –

cevap

0

Muhtemelen sadece VE 's kullanmalıdır ve OR en

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)   
     ) 

o kadar basit olabilecek

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, Hızlı cevap için teşekkürler. Kodda değişiklik yaptım. – neoo

+0

Üç şartım var, eğer söyledikleriniz doğruysa. Ama ben – neoo

+0

condtion için farklı sütun kullanmam gerekiyor şimdi ne dediğini görüyorum .. sadece bir saniye – JamieD77