2011-10-19 13 views
1

私は6つのテーブルを持っています:LS_CLIENT_INSEE_A、B、C、など各テーブルはINSEEという1つのフィールドしか含んでいません。SQL CASE SELECT return char

入力がこれらのテーブルのいずれかに存在するかどうかを知りたいだけで、テーブル名(A、B、Cなど)から対応する文字を返すだけです。

この書き換えるために、なぜ他があります:

@TheInsee int 
AS 
BEGIN 
declare @Zone char(1) 

declare @CountA int 
declare @CountB int 
declare @CountC int 
declare @CountD int 
declare @CountF int 
declare @CountP int 

SELECT @CountA = COUNT(*) FROM LS_CLIENT_INSEE_A WHERE NO_INSEE = @TheInsee 
SELECT @CountB = COUNT(*) FROM LS_CLIENT_INSEE_B WHERE NO_INSEE = @TheInsee 
SELECT @CountC = COUNT(*) FROM LS_CLIENT_INSEE_C WHERE NO_INSEE = @TheInsee 
SELECT @CountD = COUNT(*) FROM LS_CLIENT_INSEE_D WHERE NO_INSEE = @TheInsee 
SELECT @CountF = COUNT(*) FROM LS_CLIENT_INSEE_F WHERE NO_INSEE = @TheInsee 
SELECT @CountP = COUNT(*) FROM LS_CLIENT_INSEE_P WHERE NO_INSEE = @TheInsee 

set @Zone = 
     CASE 
     WHEN @CountA > 0 THEN 'A' 
     WHEN @CountB > 0 THEN 'B' 
     WHEN @CountC > 0 THEN 'C' 
     WHEN @CountD > 0 THEN 'D' 
     WHEN @CountF > 0 THEN 'F' 
     WHEN @CountP > 0 THEN 'P'   
     END 

END 

は、クエリの上にこれを達成するための最良の方法ですか?事前に

おかげで、あなたを、 STEV

あなたはすべての @CountX変数を取り除くと取得することができ
+0

このデータベースを正規化することをお勧めします。 – Simon

答えて

2

これは、それがヒットを見つけたら、選択を停止させることにより動作するはずそして速くなり、最悪の場合は、まだなりますそのうちの。

注仮定SQLサーバー(差はLIMIT 1に比べTOP 1ある):

@TheInsee int 
AS 
BEGIN 
declare @Zone char(1) 

SELECT @Zone = 
     CASE 
     WHEN (SELECT TOP 1 1 FROM LS_CLIENT_INSEE_A WHERE NO_INSEE = @TheInsee) > 0 THEN 'A' 
     WHEN (SELECT TOP 1 1 FROM LS_CLIENT_INSEE_B WHERE NO_INSEE = @TheInsee) > 0 THEN 'B' 
     WHEN (SELECT TOP 1 1 FROM LS_CLIENT_INSEE_C WHERE NO_INSEE = @TheInsee) > 0 THEN 'C' 
     WHEN (SELECT TOP 1 1 FROM LS_CLIENT_INSEE_D WHERE NO_INSEE = @TheInsee) > 0 THEN 'D' 
     WHEN (SELECT TOP 1 1 FROM LS_CLIENT_INSEE_F WHERE NO_INSEE = @TheInsee) > 0 THEN 'F' 
     WHEN (SELECT TOP 1 1 FROM LS_CLIENT_INSEE_P WHERE NO_INSEE = @TheInsee) > 0 THEN 'P'  
     END 
END 

TOP 1 1NO_INSEEが索引付けされていない場合に重要であり、全体のテーブルと、テーブルをスキャンすることを防止するためのショートカットであります最初のヒットを取得したときに停止し、テーブル全体をスキャンし続けることはありません。

+0

ヒットした後に追加のテーブルの処理を停止しますが、ヒットした後に現在のテーブルの処理を停止するには 'EXISTS'を使う必要があります。 –

+0

本当に、RDMSを知らずに、私は 'SELECT TOP 1 1'または' SELECT 1 .. LIMIT 1 'を使うべきかどうか判断できません。 – Seph

+0

実際にはありません。 OPのコードは私にとってTSQLのように見えます。 –

1

次の操作を行います。

(SQL EXISTS()が効果的にチェックし、少なくとも単一の行の終了とはすぐに返すかどうか、それは希望ので、それはなしでだとき、最初の行が見つかったの出口ので、COUNT(*))

SELECT @Zone = CASE WHEN EXISTS (
          SELECT * FROM LS_CLIENT_INSEE_A 
          WHERE NO_INSEE = @TheInsee 
          ) 
       THEN 'A' END 

...