2016-03-15 92 views
-1

我有这个疑问:Case语句中JOIN

Select b.building_pk, bil.building_fk, bil.BillingAccountStatus_fk, b.ACTL_TNT_CT 
From [DB].[Schema].Building b (nolock) 
left Join [DB].[Schema].Billing bil (nolock) on bil.building_fk = b.building_pk 
join ##GlobalTempTable1 tt (nolock) on tt.Building_fk = b.building_pk 
Order by b.building_pk; 

它工作正常。但是我想在bil.building_fkbil.BillingAccountStatus_fk列的结果集中覆盖NULL s,因为Billing tbl中的所有内容都不存在于建筑物表格中。

所以写下面的查询,但得到这个错误信息。

消息102,级别15,状态1,行7'='附近语法不正确。

请协助。

SELECT b.building_pk, bil.building_fk As [BLD Key from Billing], bil.BillingAccountStatus_fk, b.ACTL_TNT_CT As [ActualTenantCount] 
FROM [DB].[Schema].Building b (nolock) 
join ##GlobalTempTable1 tt (nolock) ON tt.Building_fk = b.building_pk 
left Join [DB].[Schema].Billing bil (nolock) ON 
CASE 
    WHEN bil.building_fk IS NOT NULL 
     THEN bil.building_fk = b.building_pk AND bil.BillingAccountStatus_fk = bil.BillingAccountStatus_fk 
    WHEN bil.building_fk IS NULL 
     THEN bil.building_fk = NULL AND bil.BillingAccountStatus_fk = 'Not in Billing' 
    END 
ORDER BY b.building_pk; 
+4

您的逻辑多个错误,如'= NULL'。 –

+4

CASE不是一个声明,它是一个函数/表达式。它应该返回一个值,而不是尝试赋值。 – RBarryYoung

+0

您不能使用这种情况下的表达式。你在这里有很多问题很难解决所有问题。全局临时表。由于并发问题,这些问题非常严重。你有NOLOCK乱丢一切。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/你有条件检查列= NULL。这不起作用,因为Nothing = NULL。那些需要使用ISNULL或COALESCE, –

回答

1

很难说出你想要做什么,因为它是非常错误的。不过,我认为你要保持你的FROM一致,并将CASE声明放到SELECT中。

Select b.building_pk, CASE WHEN bil.Building_fk IS NULL THEN 'Not in Billing' ELSE bil.building_fk END as building_fk, bil.BillingAccountStatus_fk, b.ACTL_TNT_CT 
From [DB].[Schema].Building b (nolock) 
left Join [DB].[Schema].Billing bil (nolock) on bil.building_fk = b.building_pk 
join ##GlobalTempTable1 tt (nolock) on tt.Building_fk = b.building_pk 
Order by b.building_pk; 

或者,更好的是,使用COALESCE()这里:

Select b.building_pk, COALESCE(bil.Building_fk,'Not in Billing') as building_fk, bil.BillingAccountStatus_fk, b.ACTL_TNT_CT 
From [DB].[Schema].Building b (nolock) 
left Join [DB].[Schema].Billing bil (nolock) on bil.building_fk = b.building_pk 
join ##GlobalTempTable1 tt (nolock) on tt.Building_fk = b.building_pk 
Order by b.building_pk; 
+0

感谢您的解决方案。但是目标是在bil.Building_fk为NULL时替换列bil.BillingAccountStatus_fk中的NULL。 – enigma6205

+0

然后将该案例声明移至该字段并翻转该Else以指向该其他字段。 – JNevill

0

CASE表达式不能被用来设置您使用的JOIN标准,他们可以比较的任何一侧运营商JOIN标准,但我不认为你需要,我认为你只需要在LEFT JOINCOALESCE()SELECT

SELECT b.building_pk 
    , bil.building_fk As [BLD Key from Billing] 
    , COALESCE(bil.BillingAccountStatus_fk,'Not in Billing') 
    , b.ACTL_TNT_CT As [ActualTenantCount] 
FROM [DB].[Schema].Building b 
join ##GlobalTempTable1 tt 
    ON tt.Building_fk = b.building_pk 
left Join [DB].[Schema].Billing bil 
    ON bil.building_fk = b.building_pk 
ORDER BY b.building_pk; 

编辑:注意力BillingAccountStatus_fk来自bil两侧,所以从JOIN标准中删除。

+0

目标是在bil.Building_fk为NULL时替换列bil.BillingAccountStatus_fk中的空值 – enigma6205

+0

这就是查询所做的事情:'COALESCE()'返回集合中的第一个非空值,在这种情况下,如果是'bil。BillingAccountStatus_fk'为空它返回'Not in Billing' –

0

我猜测你正在尝试做这样的事情:

SELECT b.building_pk, bil.building_fk As [BLD Key from Billing], bil.BillingAccountStatus_fk, b.ACTL_TNT_CT As [ActualTenantCount] 
FROM [DB].[Schema].Building b (nolock) 
join ##GlobalTempTable1 tt (nolock) ON tt.Building_fk = b.building_pk 
left Join [DB].[Schema].Billing bil (nolock) ON 
    (bil.building_fk IS NOT NULL AND 
     (bil.building_fk = b.building_pk AND bil.BillingAccountStatus_fk = bil.BillingAccountStatus_fk)) 
    OR (bil.building_fk IS NULL AND 
     (bil.building_fk = NULL AND bil.BillingAccountStatus_fk = 'Not in Billing')) 
ORDER BY b.building_pk; 

我将离开误导使用nolock另一天...

+0

我意识到与nolock使用有关的问题,但是我在prod中工作,所以我被要求在没有放置nolock的情况下不会运行任何东西.... – enigma6205

+0

我试过您的查询和它已成功执行,但在bil.BillingAccountStatus_fk列中的NULL未被替换...我是否需要将“bil.building_fk = NULL”中的“=”替换为“bil.building_fk IS NULL”?刚试过用“IS NULL”没有帮助NULL替换。 – enigma6205