Помогите с Joins пожалуйста - Где на поле CASE? - PullRequest
0 голосов
/ 11 января 2011

tblSource - имеет ActionID, SourceName и SourceID. TblX - имеет ActionCode и SourceName. LkuActionCode - имеет оба.

Мне также нужен CASE, потому что ActionCodes в tblX отличаются от ActionCodes в lkuActionCode ....

Я пытаюсь отобразить SourceID, ActionID и все остальное из tblX в одном запросе ...

сейчас я получаю сообщение об ошибке: Неверное имя столбца 'newAction2'.на последней строке ... пожалуйста, помогите

select  t2.Sourceid, t1.actionCode , t3.ActionID
CASE   
WHEN  t1.actionCode  = 'R' THEN 'N' END AS newAction2
from tblSource t2 
right join  tblX t1 on t1.SourceName= t2.SourceName
right join lkuActionCode t3 on t3.actioncode = newAction2

Ответы [ 3 ]

3 голосов
/ 11 января 2011
select  t2.Sourceid, t1.actionCode , t3.ActionID,

CASE WHEN  t1.actionCode  = 'R' THEN 'N' END AS newAction2

from tblSource t2 
right join  tblX t1 on t1.SourceName= t2.SourceName
right join lkuActionCode t3
       on t3.actioncode = CASE WHEN t1.actionCode  = 'R' THEN 'N' END

Однако, ЛЕВЫЕ СОЕДИНЕНИЯ обычно предпочтительнее, чтобы избежать путаницы позже. Или вам даже нужны НАРУЖНЫЕ СОЕДИНЕНИЯ?

select
    t2.Sourceid, t1.actionCode , t3.ActionID,
    CASE WHEN t1.actionCode  = 'R' THEN 'N' END AS newAction2
from
    lkuActionCode t3
    LEFT JOIN
    tblX t1 on t3.actioncode = CASE WHEN 1.actionCode  = 'R' THEN 'N' END
    LEFT JOIN
    tblSource t2 t1.SourceName= t2.SourceName
2 голосов
/ 11 января 2011

Вы не можете ссылаться на newAction2 в операторе соединения. Попробуйте повторить регистр в соединении, например:

select 
   t2.Sourceid
  ,t1.actionCode
  ,t3.ActionID
  CASE   
    WHEN t1.actionCode = 'R' THEN 'N'
  END AS newAction2
from tblSource t2 
right join tblX t1
  on t1.SourceName= t2.SourceName
right join lkuActionCode t3
  on t3.actioncode = CASE   
    WHEN t1.actionCode = 'R' THEN 'N'
  END

Хотите ли вы, чтобы код действия, не являющийся R, проходил без изменений? Если так:

select 
   t2.Sourceid
  ,t1.actionCode
  ,t3.ActionID
  CASE   
    WHEN t1.actionCode = 'R' THEN 'N'
    ELSE t1.actionCode
  END AS newAction2
from tblSource t2 
right join tblX t1
  on t1.SourceName= t2.SourceName
right join lkuActionCode t3
  on t3.actioncode = CASE   
    WHEN t1.actionCode = 'R' THEN 'N'
    ELSE t1.actionCode
  END

Вы также можете использовать подзапрос, чтобы сделать оператор case только один раз:

 select 
   t2.Sourceid
  ,t1.actionCode
  ,t3.ActionID
  ,fixedActionCode.actionCode
from tblSource t2 
right join tblX t1
  on t1.SourceName= t2.SourceName
right join (
  SELECT
     CASE
       WHEN t1.actionCode = 'R' THEN 'N'
       ELSE t1.actionCode
     END as actionCode
    ,otherField1
    ,otherField2  
  FROM lkuActionCode     
) as fixedActionCode
  on t3.actioncode = fixedActionCode.actionCode
0 голосов
/ 11 января 2011

Если вы просто отображаете одно значение, вы можете сделать выражение объединения

  ON t3.actioncode = 'N' 
   AND t1.actionCode = 'R'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...