2016-12-28 1 views
2

SQLサーバー2012テーブル@Table1に2つのユーザー定義テーブルタイプがあり、列名はColumnTable2ColumnTable1@Table2です。他のデータ型がNULLの場合、ユーザー定義のテーブル行を選択する方法

物理テーブルemployeeDataからデータを選択したいとします。この表には、両方の列(ColumnTable1ColumnTable2が入っています)があります。

@table1@table2の両方にデータがある場合、両方のUDTの値が一致する場合は、employeeDataを返します。それらのうちの1つだけの場合は、そのテーブルから一致する値を返す必要があり、両方がnullの場合は、Employeedataテーブルのすべてのデータを返す必要があります。

私はそれらの両方がうまく動作するクエリを試しましたが、それらはnullではありません。

SELECT * FROM employeeData WHERE 
     (((NOT EXISTS (SELECT 1 FROM @Table1) OR ColumnTable1 IN (SELECT 
     ColumnTable1 FROM @Table1)) AND (NOT EXISTS (SELECT 1 FROM @Table2) 
     OR ColumnTable2 in (SELECT ColumnTable2 FROM @Table2))) 

PS:この例は、2つのテーブルのみです。今後同様のフィルタリングのためにこのようなユーザー定義テーブルを追加する必要があります。

+0

は、あなたがサンプルデータセットと予想される出力を提供することができますしてみてください。私はこれがあなたの質問の第3段落を明確にするのに役立つと思います。 – scsimon

答えて

1

この

select t.* 
from employeeData t 
left join @Table1 t1 on t1.ColumnTable1 =t.ColumnTable1 
left join @Table2 t2 on t2.ColumnTable2 =t.ColumnTable2 
where 
not (t1.ColumnTable1 is null and exists (select top 1 1 from @Table1)) 
and 
not (t2.ColumnTable2 is null and exists (select top 1 1 from @Table2)) 
+0

こんにちは、それは完璧に働いていて、同様の左結合を使用し、 'と (t2.ColumnTable2はnullであり、存在します(@ Table2からトップ1を選択してください))'を繰り返すだけで新しいフィルタを含めることができます。私はちょうどいくつかの質問があります。あまりにも多くの結合を使用してもクエリのパフォーマンスに影響しませんか? (私の要件は、最大で1ダースのユーザー定義のテーブルタイプに拡大することができます)さらに、キーワード「not」はどのように条件を満たしていますか?申し訳ありませんが、SQLの初心者です。ありがとう!! –

+0

役に立つと分かったら、その答えに同意してください。条件を追加する必要がある場合は、多くのオプションはありませんが、テーブルに適切なインデックス(物理的および可変的な両方)を置くと、パフォーマンスは非常に良好になります。 – MtwStark

+0

キーワード「NOT」は単にそれに続くものの真偽否定である。この場合、「ColumTable1はnullではありません」と読むことができます(これは、@ Table1が空ではなく、一致していることを意味します)** OR **(AおよびB)=(AまたはBではないため) ) '@ Table1'は空です – MtwStark

関連する問題