0

我正在尝试更改从多个连接表中选择数据的基本查询,并根据CASE WHEN以下内容过滤掉行。结果集返回如下:

  • 如果所有行在列中都返回 0,则在CASE列中返回一行 '0' OVERDUE(“返回一行”部分由 .)处理DISTINCT。)

  • 如果任何行为该列返回 1,则在该CASE列中返回一个带有 '1' 的OVERDUE行。

基数如下:

SELECT DISTINCT t1.*,
CASE WHEN t3.MTemp > t3.MTempLimit
    then 1
        when t3.TotHours > t3.THoursLimit
            then 1
            else 0
end  [Overdue]
  from table_1 t1
LEFT JOIN table_2 t2 on t1.ResNo = t2.ResNo and t1.PCode = t2.PCode 
LEFT JOIN table_3 t3 on t2.RepJobNo = t3.RepJobNo
LEFT JOIN table_4 t4 on t4.TypeID = t2.RepType
    WHERE t2.RepStat = 1

问题是,我已经通过使用临时表并对临时表的列进行IF EXISTS/ELSE查询来创建它的工作版本。OVERDUE但是,我被告知此解决方案可能无法使用(由于必须通过某些前端软件)。

是否可以为此做一个不涉及使用临时表的解决方法?我一直在尝试同时使用派生表和 CTE,但它们都没有产生任何可用的东西,因为不能IF/ELSE在它们之后使用子句(这是我所指望的)。

我仍然掌握 T-SQL 的窍门,因此将不胜感激任何帮助。

4

2 回答 2

1

通常,在另一个查询中引用的任何临时表都可以简单地替换如下,这样:

insert #temp
select -- definition of temptable
;
select ... 
from #temp
join ...

变成

select
from ( 
  -- definition of temptable
) temp
join ...
于 2013-05-03T06:24:27.313 回答
1

听起来很简单ROW_NUMBER(),几个 CTE 就可以了:

;WITH RS1 as (
  SELECT t1.*,
  CASE WHEN t3.MTemp > t3.MTempLimit
    then 1
        when t3.TotHours > t3.THoursLimit
            then 1
            else 0
  end  [Overdue]
  from table_1 t1
  LEFT JOIN table_2 t2 on t1.ResNo = t2.ResNo and t1.PCode = t2.PCode 
  LEFT JOIN table_3 t3 on t2.RepJobNo = t3.RepJobNo
  LEFT JOIN table_4 t4 on t4.TypeID = t2.RepType
      WHERE t2.RepStat = 1
 ), RS2 as (
     select *,ROW_NUMBER() OVER (ORDER BY Overdue DESC) rn
     from RS1
 )
 select * from RS2 where rn = 1

DISTINCT(现在我们只返回一行就不需要了)

于 2013-05-03T06:16:09.543 回答