2016-04-08 2 views
0

Msg 156, Level 15, состояние 1, строка 8 Неправильный синтаксис около ключевого слова «ДЕЛУ»Case Состояние присоединиться колонки

Я пытаюсь объединить столбцы на основе значения столбца.

Если дело Conditon 1 верно, то я хочу присоединиться к ON im.ItemNumber = левый (tr.itemnumber, длина (tr.itemnumber) -4)

если условие случая 2 истинно, то

ON tr.ItemNumber = im.LegacyItemNumber

еще

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

[Это] (http://stackoverflow.com/questions/ 10256848/can-i-use-case-statement-in-a-join-condition/10260297 # 10260297) Ответ может быть полезен. Вы можете манипулировать условием соответствия в 'case', но не можете переключать другие части запроса, например. таблицы, волей-неволей. Вы все еще можете присоединиться ко всему и попытаться разобраться в «где», но наступает момент, когда вещи выходят из-под контроля. – HABO

+0

Также обратите внимание, что такие условные объединения не рекомендуются и почти всегда могут быть заменены каким-либо другим подходом, например объединением. Sql отлично работает в операциях на основе набора, любой структурный код будет работать хуже. Такая условная логика может рассматриваться как ... else. Пожалуйста, проверьте эту статью: https://www.simple-talk.com/sql/performance/how-to-avoid-conditional-joins-in-t-sql/, например. Вы найдете больше в Интернете. –

ответ

0

Вы, вероятно, следует использовать только для AnD и 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)   
     ) 

это может быть просто так просто, как

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

Эй, спасибо за быстрый ответ. Я внес изменения в код. – neoo

+0

У меня есть три условия. Если есть условия, то, что вы сказали, правильно. Но мне нужно использовать другой столбец для конденции – neoo

+0

. О, я вижу, что вы сейчас говорите .. всего лишь секунд – JamieD77

Смежные вопросы