2012-07-20 47 views
0

我有一个查询与联合声明,只是为了检查案例,但我想实现CASE在哪里,但我是初学者到SQL,不知道我该怎么做。如何使用SQL中的CASE优化查询

我的查询像

SELECT TOP 1 EndDate 
      FROM (
         SELECT 1 AS seq, 

          EndDate, 

         FROM pipeline_rest_envr_info e 
         WHERE e.tckt_id = imt.tckt_id 
          AND stat = 'INPR' 
         UNION 
         SELECT TOP 1 2 AS seq, 

          EndDate, 

         FROM pipeline_rest_envr_info e 
         WHERE e.tckt_id = imt.tckt_id 
          AND stat = 'CMPL' 
         ORDER BY 
          enddate DESC 
         UNION 
         SELECT TOP 1 3 AS seq, 

          EndDate, 

         FROM pipeline_rest_envr_info e 
         WHERE e.tckt_id = imt.tckt_id 
          AND stat = 'PLND' 
         ORDER BY 
          strt_dt 
         UNION 
         SELECT 4 AS seq, 

          NULL, 

         FROM pipeline_rest_envr_info e 
         WHERE e.tckt_id = imt.tckt_id 
       ) aa 
      ORDER BY 
        aa.seq 
+2

其中 “IMT” 的别名从何而来?我认为你的代码中缺少一些东西。 – 2012-07-20 11:47:32

+1

我也认为内部联盟要么缺少其他信息,要么构建不正确。为什么有些没有订购,有些是按日期列升序排列的,有些是按日期列降序排列的?也许不是告诉我们你想要解决这个有问题的查询,你可以向我们展示你的表格结构,样本数据和期望的结果。这似乎不是在一张表中找到单行的正确方法。 – 2012-07-20 11:57:15

回答

2

SELECT TOP 1结束日期
FROM(
选择(情况下,当STAT = 'INPR' 然后1
当STAT = 'CMPL' 然后2
当STAT = 'PLND',那么3
其他4端
)为SEQ,结束日期
从pipeline_rest_envr_infoË
左外连接table2name IMT上e.tckt_id = imt.tckt_id
)AA
ORDER BY
aa.seq在WHERE

+0

你为什么要发布两个单独的答案?我们是否应该相信其中之一?也请使用'{}'按钮突出显示代码示例。 – 2012-07-20 12:53:07

0

SELECT TOP 1节AA *
FROM(
选择(案例CONDITION1然后RESULT1时
CONDITION2然后RESULT2时
...
其他
default_result
end)as result,... from tablename
)aa
ORDER BY
aa.seq

0

避免执行情况。而是将其应用于SELECT。进一步还没有提到代表别名IMT表

SELECT TOP 1结束日期
FROM(
选择

情况下,当STAT = 'INPR' 然后1
当STAT = 'CMPL',那么2
当STAT = 'PLND' 然后3
其他4端
)为SEQ,结束日期
从pipeline_rest_envr_infoË
内部联接whateve rthetablenameis IMT上e.tckt_id = imt.tckt_id
)AA
ORDER BY aa.seq

+0

'千万不要在何处执行CASE为什么?***另外,请使用'{}''按钮来突出显示代码示例。 – 2012-07-20 12:53:50

+0

我知道{},因为我是新来的。无论如何,谢谢。我的意思是避免使用case,因为在where子句中处理它比较困难,在select子句中要简单得多 – 2012-07-20 13:01:55

+0

感谢Aaron的建议。我编辑了我的回复 – 2012-07-20 13:02:43