2016-10-30 30 views
0

私は次のSELECT文を使用して、3つのテーブルに入力されたリストをウェブサイトのグリッドに挿入しています。いずれかのリストは1つの以上のカテゴリを持つことができますが、私の問題のarrisesは、私は(CategoryY & CategoryZを使用しているListingX)を持っているときCatX &のために二度私のリストに表示されますと、私はちょうどジャンクションテーブルを実装しました3つ以上のテーブルの結合で重複を削除します

BND_Listing = Main Data 
BND_ListingCategories = My Category data for the Listing Table 
BND_LingingJunction = Junction Table for multi-category listings. 

なぜなら、なぜ2回表示されているのか理解していますが、すべてのカテゴリごとに1回だけ表示されるようにしたいのです。

SELECT DISTINCT * FROM BND_ListingJunction 
    JOIN BND_listing on BND_listing.LID = BND_ListingJunction.Junc_LID 
    JOIN BND_ListingCategories 
     on BND_ListingCategories.CatID = 
      BND_ListingJunction.Junc_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') 
    and isnull(Company,'') <> '' 
ORDER by Company ASC 

私は明確な使用は、それは私のジャンクションテーブルから引いて第一だから、おそらく、クエリのニーズが異なって編成することがここで働いていないことを実現?

+0

distinctはクエリのすべての出力列に適用されるため、BND_Listingを使用してください。 –

+0

@CharlesBretanaそういう意味で私はJOINSのものにも明確に適用していますか? – UserSN

+0

いいえ、私の編集した答えを見てください。 Distinctはクエリ全体の最終出力に適用されます。出力全体(すべての列)を考慮して、同じ行(すべての列値が同一)の行がある場合は、余分な重複が排除されます。クエリでは、クエリのすべてのテーブルのすべてが選択されているため、各カテゴリのカテゴリ値が異なるため、これらの行は異なり、排除されません。リスト表の列のみに出力を制限する必要があります。必要な列を明示的にリストすることも、サブクエリを使用することもできます。 –

答えて

1

distinctはクエリの各出力列に適用されるためです。
City,Region,CountryおよびCompanyはどのテーブルですか?彼らは `である場合

SELECT DISTINCT * FROM BND_Listing l 
Where Exists 
    (Select * from BND_ListingJunction j 
     join BND_ListingCategories c 
      on c.CatId = j.Junc_CatID 
    Where j.Junc_LID = l.LID 
     and (c.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') 
     and isnull(Company,'') <> '') 
ORDER by l.Company ASC 

:彼らはあなたが掲載とカテゴリの明確なリストが必要な場合はListingJunction' or ListingCategories`、 、

SELECT DISTINCT l.*, c.CategoryName 
FROM BND_Listing l 
    Join BND_ListingJunction j 
     on j.Junc_LID = l.LID 
    join BND_ListingCategories c 
     on c.CatId = j.Junc_CatID 
Where (c.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') 
     and isnull(Company,'') <> '' 
Order by l.Company, l.LID 

している場合あなたが望むすべては掲載の明確なリストはこれを試している場合

SELECT DISTINCT * FROM BND_Listing l 
Where Exists 
     (Select * from BND_ListingJunction j 
     join BND_ListingCategories c 
      on c.CatId = j.Junc_CatID 
     Where j.Junc_LID = l.LID 
      and (c.CategoryName = '[querystring:filter-Category]' or 
        '[querystring:filter-Category]'='All')) 
    and (l.City = '[querystring:filter-City]' or 
        '[querystring:filter-City]'='All') 
    and (l.Region= '[querystring:filter-State]' or 
        '[querystring:filter-State]'='All') 
    and (l.Country= '[querystring:filter-Country]' or 
        '[querystring:filter-Country]'='All') 
    and isnull(l.Company,'') <> '' 
ORDER by l.Company ASC 
+0

これはありがたいことですが、私のカテゴリ名は引き込まれていません。私はBND_ListingCategoriesテーブルに "CategoryName"というフィールドが表示されていません。 – UserSN

+1

あなたは出力にカテゴリ名を追加する必要があります –

+0

私はそれをUNIONで行いますか? – UserSN

関連する問題