使用GROUP By显示3个表

时间:2016-10-31 21:15:51

标签: sql tsql

我已经创建了一个列表页面,其中有3个表

BND_Listing BND_ListingCategories BND_ListingJunction

联结表包含ListingID& CategoryID用于匹配哪些列表属于哪些类别。

我使用以下select语句将这3个表中的数据提取到我网站上的网格中。

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

以下查询工作正常,但由于我在多个类别中列出了一些列表,因此我的网格上的每个类别都会重复列表。

我希望一次只显示1个唯一列表,即使它们可能属于多个类别。

我不知道如何做到这一点。我有另一篇文章解释我是如何做到这一点的。 Eliminate duplicates in Join over 3 Tables

任何例子,洞察力都赞赏!

1 个答案:

答案 0 :(得分:1)

最简单的方法是从SELECT

中删除类别
SELECT DISTINCT l.*

另一种方法是保留单身人士的类别名称,并显示'Multiple'倍数:

SELECT l.company, l.LID, . . .,
       (CASE WHEN MIN(c.CategoryName) = MAX(c.CategoryName) THEN MIN(c.CategoryName)
             ELSE 'Multiple'
        END) as CategoryName
FROM . . .
GROUP BY l.company, l.LID, . . .;

这很容易扩展到显示两个不同的类别,其中'More than 2'为倍数。

更痛苦的方法是将类别连接在一起。