0

複数の結合されたテーブルからデータを選択し、以下に基づいて行を除外する基本クエリを変更しようとしていCASE WHENます。結果セットは次のように返されます。

  • すべての行が列に 0 を返す場合、CASE列に '0' を含む 1 行を返しOVERDUEます (「1 行を返す」部分は によって処理されDISTINCTます)。

  • いずれかの行が列に対して 1 を返す場合、CASE列に '1' を含む 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

( DISTINCT1 行しか返さないので、現在は必要ありません)

于 2013-05-03T06:16:09.543 に答える