案例陈述为vals外部申请

时间:2015-07-10 13:57:38

标签: sql case common-table-expression alter outer-apply

我正在尝试将计算列添加到表中。目前,我有以下CASE语句在SELECT语句中构建计算列,

- 但我想用这个列来确定后续的列(sooo ..添加一个计算列有点是一种解决方法,以避免复杂的CTE,我不知道我能弄清楚 - 让我知道CTE或函数是一个更好的方式去)

---我希望CASE语句成为表本身的计算列

SELECT top 1000
L.[MsgDate]
,C.[AlarmType]
,L.[Type]
,L.[UsrStr1]
,L.[UsrStr4]
,L.[UsrStr5]
,L.[UsrStr12]
,L.[UsrStr15]
,CASE
    WHEN EXISTS 
    (
    SELECT *
    FROM   Breinigsville.dbo.SCADA_SR S
    WHERE  S.SCADA_SR_TAG = L.UsrStr15 and 
            ((L.[UsrStr4]='analog' and C.[AlarmType] like '%HH%') or (L.[UsrStr4]='status'))
    )
        THEN 1
        ELSE 0
    END AS [Safety]



FROM [Breinigsville].[dbo].[LMFW] L


  full outer join [Breinigsville].[dbo].[_AcknowledgedAlarms] C
  on
  L.SeqNo=C.SeqNo2



  WHERE (
L.[Type]='Ack' AND 
L.UsrStr12 LIKE '%CCXOS%' AND 
L.UsrStr12 NOT LIKE '%CCXOS5' AND 
L.UsrStr12 NOT LIKE '%CCXOS6' AND 
L.UsrStr12 NOT LIKE '%CCXOS9' AND 
L.UsrStr12 NOT LIKE '%CCXOS12' AND 
L.MsgDate>getdate()-1


)

order by L.SeqNo desc

1 个答案:

答案 0 :(得分:1)

使用outer apply

FROM [Breinigsville].[dbo].[LMFW] L full outer join
     [Breinigsville].[dbo].[_AcknowledgedAlarms] C
     on L.SeqNo = C.SeqNo2 OUTER APPLY
     (SELECT (CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END) as Safety
      FROM   Breinigsville.dbo.SCADA_SR S
      WHERE  S.SCADA_SR_TAG = L.UsrStr15 and 
             ((L.[UsrStr4] = 'analog' and C.[AlarmType] like '%HH%') or
              (L.[UsrStr4] = 'status')
             )
     ) vals

然后,您可以在查询中的任何位置使用vals.Safety

注意:此版本使用count(*)。如果性能完全受到关注,那么您可以使用其他子查询获得所需的内容。我这样回答,因为查询的结构似乎更容易理解。

顺便说一句,您不能轻易地将子查询作为计算列放入。您可以这样做,但它需要创建一个用户定义的函数,并将其用于计算列。 OUTER APPLY肯定更简单,您甚至可以将此逻辑放入 table 值的函数或视图中。