2017-04-18 58 views
0

我必须在SQL中执行请求。我有论文表CASE加入SQL Server

enter image description here

我愿意做这个请求,但请求从来没有给我的结果:

Select CDR.*, 
    p1.* 
From dbo.T_CDR_APPEL CDR 
    Inner Join dbo.POS As p1 On Case 
     When CDR.CDR_LOC_CODE Like 'CH%' And CDR.CDR_TYPE Like 'I%' And 
     CDR.CDR_LOC_CODE = p1.Loc_Code Then 1 
     When CDR.CDR_LOC_CODE Like 'CCN%' And CDR.CDR_TYPE Like 'I' And 
     CDR.CDR_LAST_REDIR_NO = p1.Post_type Then 1 Else 0 End = 1 

我也试过

Select CDR.*, 
    p1.* 
From dbo.T_CDR_APPEL CDR 
    Inner Join dbo.POS As p1 On CDR.CDR_LOC_CODE = p1.Loc_Code 
Where CDR.CDR_LOC_CODE Like 'CH%' And CDR.CDR_TYPE Like 'I%' 
Union All 
Select CDR.*, 
    p1.* 
From dbo.T_CDR_APPEL CDR 
    Inner Join dbo.POS As p1 On CDR.CDR_LAST_REDIR_NO = p1.Post_type 
Where CDR.CDR_LOC_CODE Like 'CCN%' And CDR.CDR_TYPE Like 'I' 

但相同的结果,该请求似乎正在工作,但不成功。

感谢您的帮助!

更新:它现在与联盟工作! Thnak为您提供帮助!

+0

当你可以用简单的'AND' /'OR'来做同样的事情时,你不应该使用'CASE'。但是,要找出您的情况失败的地方,请一步一步来。例如:'从dbo.t_cdr_appel中选择cdr_loc_code如'CH%'和cdr_type'I%''并查看是否有任何记录。如果是这样,你会得到什么CDR_LOC_CODE?它们存在于dbo.POS中吗? –

+0

CDR_LOC_CODE存在于dbo.POS中! – Alexandre

+0

所以我的查询返回记录?并且它返回与Pos.Loc_Code相匹配的CDR_LOC_CODE?那很奇怪你的查询没有得到那些匹配。那时必须是一个错字。 –

回答

1

跳过case表达,使用AND/OR代替:

select CDR.*, 
     p1.* 
from dbo.T_CDR_APPEL CDR 
inner join dbo.POS As p1 
    on (CDR.CDR_LOC_CODE Like 'CH%' and CDR.CDR_TYPE Like 'I%' And 
     CDR.CDR_LOC_CODE = p1.Loc_Code) 
    or (CDR.CDR_LOC_CODE Like 'CCN%' and CDR.CDR_TYPE Like 'I' And 
     CDR.CDR_LAST_REDIR_NO = p1.Post_type) 

一般来说,最好在ONWHERE条款使用的AND/OR代替case表达式。

+0

同样的结果,请求似乎正在工作,但不成功。也许请求是服务器的时间太长 – Alexandre

+0

尝试一些更“放松”的条件,看看你是否至少得到了一些结果。如果你例如删除LIKE部分? – jarlh

+0

但是我知道使用内部连接或条件是不好的,不是吗? – Alexandre