2016-08-16 5 views
1

"DATA_TABLE"の列2が "唯一"の場合、列1の "table_ID"の別のリストを返そうとしています。column2のすべての行がNULLのときに別のcolumn1sデータを返します

Table_ID | Value 

1  | null 

2  | 55 

1  | null 

3  | 5 

3  | null 

ので、このクエリで - 私は1のtable_idは戻したいだけだろう、2にはヌルを持っていない、と3がnullではない何かが含まれています。 VALUEがインデックスに登録されていないため、このステートメントは効率的ではないかもしれませんが、これは満足できるはずです。

DATA_TABLESの未知の量があり、私は上記のチェックをそれぞれ行う必要があります。どのようにこれらのすべてをループしますか?

カーソルを定義しようとすると、私は難しそうに走っています。私は、各DATA_TABLEs名のリストを持つテーブルを持っていて、それを無駄に反復しようとします。

は、ここで私は私のカーソルのために持っているものだ - そしてRN_TABLEが

DECLARE @RN_TABLE varchar(50) 
DECLARE RN_CURSOR CURSOR LOCAL FORWARD_ONLY static For 
select r_table from S_DATA 

OPEN RN_CURSOR 
IF @@CURSOR_ROWS > 0 
BEGIN 
FETCH NEXT FROM RN_CURSOR INTO @RN_TABLE 
WHILE @@Fetch_status = 0 
BEGIN 
select table_id from @RN_TABLE group by table_id having max(Datavalue) is null 
FETCH NEXT FROM RN_CURSOR INTO @RN_TABLE 
END 
END 
close RN_CURSOR 
DEALLOCATE RN_CURSOR 
+2

すべてのデータを1つのテーブルに格納する必要があります。同じスキーマを持つ複数の表は、データベース構造の問題の兆候です。 –

+0

私はそれを解決する能力がありません。私は製品をサポートするだけで、開発することはありません。 –

+0

'@ RN_TABLE'はテーブルではありません。それをフェッチするときは、列名のないvarchar変数です。 table_id from @ RN_TABLEを選択すると、テーブル変数ではない変数から存在しない列を選択しようとしています。 – scsimon

答えて

1

having max(samplevalue) is nullが過剰であると宣言されていないことを訴えています。単純なwhere samplevalue is nullは簡単です。

また、重複を除去しUNIONを使用して、すべてのテーブルの結果を結合することができます。

SELECT table_id FROM table1 WHERE samplevalue IS NULL 
UNION 
SELECT table_id FROM table2 WHERE samplevalue IS NULL 
UNION 
SELECT table_id FROM table3 WHERE samplevalue IS NULL 
UNION 
<...and so on...> 
SELECT table_id FROM table999 WHERE samplevalue IS NULL). 
+0

1から500以上の範囲のテーブルが不明です。これ以上の方法はありませんか? –

+1

いいえ、データベースはテーブルをオーバーライドするのではなく、データを反復処理します。他の人が言っていたように、同じ構造のテーブルを複数持つことは、真剣に欠陥のあるデザインのようなにおいをしています。 _Bad Design_は悪いことではありませんが、あなたのような問題が発生するためです。 – Aganju

+0

それは 'UNION ALL'ではありませんか? 'UNION'は重複を取り除くので、' GROUP BY table_id'と重複しているようです。 –

1

あなたがtable_id秒のテーブルを持っている場合は、これは速いかもしれません:

select t.table_id 
from tables t 
where not exists (select 1 
        from RN_QOS_DATA_0011 d 
        where d.table_id = t.table_id and d.samplevalue is not null 
       ); 

これはRN_QOS_DATA_0011(table_id, samplevalue)のインデックスを利用することができます。

table_idがテーブルのいずれかでヌルでないようにする場合は、orとサブクエリを使用してwhereを拡張できます。

あなたのデータ構造を再考することをお勧めします。同じデータを持つ複数の異なるテーブルを持つことは悪い考えです。必要に応じて、テーブルを作成してマスターテーブルにロードするときにコードを実行することができます。これにより、カーソルなしでさらに便利に使用できます。

+0

Ahh;だから私は言及するのを忘れていました - table_idは各RN_ *(r_Table)に固有です。この例では、返されるテーブルに見つからない場合がありますか? –

関連する問題