select descrL as division, product
from Lower
where DescrL like @params + '%'
union
Select descr, product
from Upper
where Descr like @params = '%'
これは非常にパフォーマンスが高いでしょう。一致が上部の選択で見つかった場合、それはすべてのユニオンではなくユニオンであるため、下部の選択では抑制される必要があります。inの代わりにlikeに注意してください。inを実行する場合、結果を見つけるためにDescrLまたはDescrのインデックスを使用する方法はありません。あなたが好きなら、インデックスはうまく使われます。それを機能させるには、アプリケーションロジックを調整する必要があるかもしれません。
それができない場合は、この解決策があります。データベースにfn_splitを追加する必要があります。 http://msdn.microsoft.com/en-us/library/aa496058(v=sql.80).aspx
select descrL as division, product
from Lower l
join dbo.fn_Split(@params, ',') p1
on l.DescrL = p1.value
union
Select descr, product
from Upper u
join dbo.fn_Split(@params, ',') p2
on u.Descr = p2.value
パフォーマンスの最後のビットを本当に引き出したい場合は、テーブル変数を宣言し、fn_splitを1回だけ実行してテーブル変数にデータを入力してから、2つの結合をテーブル変数にすることができます。したがって、ここでは、列のインデックスも利用しています。これは、クエリを高速化するために必要な主なものです。SQL Serverを実行するときは、常に「実際の実行プランを含める」ことを行い、結果を確認して、テーブルスキャンではなくインデックスシークが表示されていることを確認してください。
編集:私はあなたのsqlfiddleリンクに行きました。以前は見ませんでした。これは機能します。申し訳ありませんが、あなたも部門を選択しているので、組合自体は重複を抑制しません。したがって、not inを使用するか、私が好むように、nullの場合は左アウターを使用する必要があります。
select descrL as division, productL as product
from Lower l
join @params p1
on l.DescrL = p1.division
union
Select u.descr, u.product
from Upper u
join @params p2
on u.Descr = p2.division
left join (select productL as product
from Lower l2
join @params p3
on l2.DescrL = p3.division) sub1
on u.product = sub1.product
where sub1.product is null
order by 2