2016-10-30 2 views
0

다음 표를 사용하여 세 테이블에 입력 된 목록으로 내 웹 사이트의 표를 채 웁니다. 3 테이블 이상 조인에서 중복 제거

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

난 그냥 어떤 목록이 1 개 이상의 종류가 있지만 수있는 접합 테이블을 구현했습니다 내 문제 arrises 나는 나의 CatX & 두 번 목록에 표시됩니다 (CategoryY & CategoryZ을 사용 ListingX)에있을 때 왜냐하면 왜 두 번 나타나지만 모든 카테고리에 대해 한 번만 표시되기를 바라는 이유를 이해할 수 있기 때문입니다.

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 

는 나는 1 내 접합 테이블에서 끌어 있기 때문에 여기에 작동하지 않는 별개의 사용 아마도 쿼리 요구 다르게 구성 할 수 실현?

+0

뚜렷한 것은 쿼리의 모든 출력 열에 적용되기 때문에. –

+0

@CharlesBretana 그래서 내 JOINS에도 별개로 적용됩니까? – UserSN

+0

아니요, 수정 된 답변보기. Distinct가 전체 쿼리의 최종 출력에 적용됩니다. 전체 출력 (모든 열)을 고려하여 동일한 행 (모든 열 값이 동일)이 있으면 여분의 중복이 제거됩니다. 쿼리는 쿼리의 모든 테이블에서 모든 항목을 선택 했으므로 범주 값이 각 범주마다 다르므로 해당 행이 다르므로 제거되지 않습니다. 출력을 Listing 테이블의 컬럼으로 제한해야합니다. 원하는 열을 명시 적으로 나열하거나 하위 쿼리를 사용할 수 있습니다. –

답변

1

distinct는 쿼리의 모든 출력 열에 적용되므로.
어떤 테이블이 City, Region, CountryCompany입니까? 그들은`에있는 경우

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 

에있는 경우 당신이 원하는 모든 리스팅의 별개의 목록이 시도하는 경우 BND_Listing '을 다음과 같이 입력하십시오.

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