【问题标题】:Using GROUP By to display information from 3 tables使用 GROUP By 显示来自 3 个表的信息
【发布时间】:2016-10-31 21:15:50
【问题描述】:

我创建了一个列表页面,其中有 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

任何例子,见识见识!

【问题讨论】:

    标签: sql tsql


    【解决方案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' 表示多个类别。

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

    【讨论】:

    • 当你说连接时,你的意思是我的数据手动放在桌子上吗?还是通过 TSQL 连接?显示 1 条具有串联类别的记录似乎是我正在寻找的选项。
    • @AlexP 。 . .如果您有两个以上的类别,那就太痛苦了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 2019-04-17
    • 2012-11-09
    • 2021-09-26
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多