2016-09-21 4 views
0

私は自分のサイトに2つのテーブルから会社情報を引き出しているデータグリッドを持っています。UNIONを使用してデータをグリッドに引き出す

私はこれが最初のグリッドにデータをロードするために私のクエリで3つのフィルター(カテゴリ、州、市)に基づいて、これらの結果をソートする

をフォームを作成しています。私は、それが誰も私のクエリがWHEREステートメントを完了するためにクエリ文字列の値を渡すのを待っているとしてUNIONを使用している理由は、フィルタリングすることを決定するまで、

SELECT * FROM BND_listing left join BND_ListingCategories 
on BND_Listing.CatID=BND_ListingCategories.CatID 

UNION 

SELECT * FROM BND_listing left join BND_ListingCategories 
on BND_Listing.CatID=BND_ListingCategories.CatID 
WHERE (CategoryName = '[querystring:filter-Category]' OR  '[querystring:filter-Category]' is NULL) 

これが適切な手順であるかどうかはわかりません。

このクエリのNULLパラメータを理解するのが難しいです。ページ・ロード時には、問合せ文字列はありません。

ユーザーが「SORT」ボタンを押すと、クエリ文字列がURLに追加されます。ユーザーはフィルタの1つまたは3つすべてでソートすることができますが、オプションのうちの1つのみをソートする場合もあります。クエリ文字列は、残された他の2つについてALLを渡します。

IE:フィルタカテゴリ/バーバー%20Shop /フィルタ-市/オール/フィルタステート/ここではすべての ユーザーのみ1つのドロップダウンから「バーバーショップ」を選択し、そのよう市& Stateドロップダウンを残しましたデフォルト選択。

クエリ文字列パラメータを「リッスンする」というクエリは、自分のアプリケーションで正しく機能していません。しかし、SQL Management Studioで以下のものを使用すると、正しくレコードが取得されます。

SELECT * FROM BND_listing left join BND_ListingCategories 
on BND_Listing.CatID=BND_ListingCategories.CatID 
WHERE (CategoryName = 'Barber Shop' OR '[querystring:filter-Category]' is  NULL) 

これは、3つの「リスニング」WHERE文がすべて含まれた私のデータグリッドクエリです。

SELECT * FROM BND_listing left join BND_ListingCategories 
on BND_Listing.CatID=BND_ListingCategories.CatID 

UNION 

SELECT * FROM BND_listing left join BND_ListingCategories 
on BND_Listing.CatID=BND_ListingCategories.CatID 
WHERE (CategoryName = '[querystring:filter-Category]' OR  '[querystring:filter-Category]' is NULL) 
AND (city = '[querystring:filter-City]' OR '[querystring:filter-City]' IS  NULL) 
AND (state ='[querystring:filter-State]' OR '[querystring:filter-State]' IS  NULL) 

ヘルプ、入力、例、洞察力が高く評価されています。オンライン

例& SQL Studioの enter image description here enter image description here enter image description here enter image description here

+0

最初の選択と2番目の選択結果を表示します。 –

+0

こんにちはデニー、 私は写真を追加しました。 – UserSN

+0

[querystring:filter-Category]は何ですか、それはidkです。その値はhtmlから入力されますか? –

答えて

1

連合は何をしたいあなたを取得するつもりはありません。 2つ以上のクエリの結果を一緒に結合して別個の値を保持するのが目的です。あなたのケースでは、組合の前半はすべてのデータをキャプチャし、後半はフィルタリングされたデータをキャプチャします。前半はすべてをキャプチャするので、すべてが返されます。

最初の実行でフィルタがなく、2番目の実行でフィルタが必要なため、このように表示されます。

クエリ文字列が存在しない場合は、where句を追加しないでください。存在する場合は、どこに適切な句を追加します。

あなたはsortと言いますが、あなたのクエリにはorder by句がありません。 データを並べ替える場合は、1を追加します。

第一負荷は、無where句またはすべてのフィルタは、where句で、 'ALL'

SELECT * FROM BND_listing left join BND_ListingCategories 
on BND_Listing.CatID=BND_ListingCategories.CatID 
order by CategoryName, state, city 

その後負荷に設定されています。

SELECT * FROM BND_listing left join BND_ListingCategories 
on BND_Listing.CatID=BND_ListingCategories.CatID 
WHERE (CategoryName = '[querystring:filter-Category]' OR  '[querystring:filter-Category]' is NULL) 
AND (city = '[querystring:filter-City]' OR '[querystring:filter-City]' IS  NULL) 
AND (state ='[querystring:filter-State]' OR '[querystring:filter-State]' IS  NULL) 
order by CategoryName, state, city 

編集:プラグインは唯一私が「リスニング」で仮定1.

することができますので、あなたは、2つのクエリを持つことができないあなたは、クエリ文字列を意味します。filter-カテゴリはカテゴリにあるものに置き換えられますクエリ文字列。あなたのクエリで置き換えられるので、nullと比較することはできません。フィルタは 'ALL'なので、それを考慮する必要があります。 これを試してみてください:

SELECT * 
FROM BND_listing 
left join BND_ListingCategories 
    on BND_Listing.CatID=BND_ListingCategories.CatID 
WHERE 
    (
     '[querystring:filter-Category]' = 'ALL' -- for when the queryString is set to ALL 
     or '[querystring:filter-Category]' = '' -- for when the queryString isn't available like first load. this replaces the is null comparison. you can't compare a string literal to null as they are wrapped in quotes 
     or CategoryName = '[querystring:filter-Category]' -- this is the comparison to your column 
    ) 
    AND (
     '[querystring:filter-City]' = 'ALL' 
     or '[querystring:filter-City]' = '' 
     or city = '[querystring:filter-City]' 
    ) 
    AND (
     '[querystring:filter-State]' = 'ALL' 
     or '[querystring:filter-State]' = '' 
     or state = '[querystring:filter-State]' 
    ) 
order by CategoryName, state, city 
+0

返信ありがとうございます@serverSentinel、私は2つの別のクエリを行う方法がありません私のグリッドプラグインは1つだけです。両方のクエリを組み合わせて1番目のクエリで1番目のクエリを実行し、クエリ文字列を待っている2番目のクエリを組み合わせる方法はありませんか? Sortについては、ユーザがドロップダウンからドロップするフィールドを選択して、一致するフィールドのみを取得するクエリ文字列を入力するという操作を意味していました。 SQLでは実際のSORTではありません。 – UserSN

+0

私は答えを編集しました。このインスタンスではnullとは比較できません。グリッド・プラグインが検索を行い、問合せを置換すると、(...または ''がnullである)引用符の内部の部分が置換され、決して真ではないからです。 (...または '' = '')が真となります。 – serverSentinel

+0

@serverSentinelでこのプラグインを試してみることにしました。私は今、少なくともこのクエリ文字列に少なくともALLをリダイレクトするこのページの前に別のページを追加しました。 – UserSN

0

は、すべてのヘルプ&例いただきありがとうございます。私は実際に私の質問を取得することができました私は最初に対処する必要があったグリッドに問題があった。

select * FROM BND_listing right join BND_ListingCategories 
on BND_Listing.CatID=BND_ListingCategories.CatID 
where 
(CategoryName = '[querystring:filter-Category]' or '[querystring:filter- Category]'='All') 
and 
(City = '[querystring:filter-City]' or '[querystring:filter-City]'='All') 
and 
(Region= '[querystring:filter-State]' or '[querystring:filter-State]'='All') 
and 
(Country= '[querystring:filter-Country]' or '[querystring:filter- Country]'='All') 

私は単に、グリッドが移入されたすべてのクエリ文字列フィルタのために常に少なくともALL値を渡すページリダイレクトを持っています。

関連する問題