【问题标题】:Eliminate duplicates in Join over 3 Tables消除 Join over 3 Tables 中的重复项
【发布时间】:2017-03-12 21:04:57
【问题描述】:

我正在使用以下 select 语句在我的网站上填充已输入 3 个表的列表的网格。

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

我刚刚实现了 Junction 表,因为任何列表都可以有超过 1 个类别,但是当我有(使用 CategoryY 和 CategoryZ 的列表 X)时,我的问题出现了,因为 CatX 和 CatY 会在我的列表中显示两次在我的联结表上这个特定列表有 2 个条目,所以我理解为什么它会显示两次,但我希望所有内容都只显示一次,而不是每个类别显示一次。

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

我意识到使用 distinct 在这里不起作用,因为它是从我的联结表中提取的第一个,也许查询需要以不同的方式组织?

【问题讨论】:

  • 因为 distinct 应用于查询的每个输出列。
  • @CharlesBretana 那么这是否意味着我也对我的 JOINS 应用了 distinct ?
  • 不,请参阅我编辑的答案。 Distinct 应用于整个查询的最终输出。如果考虑到整个输出(所有列),存在任何相同的行(所有列值都相同),则消除额外的重复项。您的查询从查询​​中的所有表中选择了所有内容,因此由于每个类别的类别值不同,因此这些行是不同的并且不会被消除。您需要将输出限制为仅列出列表中的列。您可以明确列出您想要的列,或使用子查询。

标签: sql-server tsql join outer-join


【解决方案1】:

因为 distinct 应用于查询的每个输出列。
CityRegionCountryCompany 在哪个表中?如果他们在ListingJunction' orListingCategories`, 如果您需要不同的列表和类别列表,

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 (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

如果它们在 `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

【讨论】:

  • 那么你需要在输出中添加类别名称
  • 你不需要这样做,你只需要明确列出你想在输出中出现的列。这些将是 distinct 关键字将操作的唯一列。
  • 那么包含类别名称的列的列名称是什么?
  • 那么我的答案中的第一个 SQL 语句应该可以工作
  • 请阅读我的回答。如果您选择包含类别名称,则不能这样做。如果列表有多个类别,计算机应该如何决定要包含哪个类别名称?执行此操作的唯一方法是让您在 SQL 查询中指定哪一个。为此,您需要将 SQL 转换为 group by SQL,并决定要列出哪个类别的名称。而Group by 查询则完全是另一个话题。
猜你喜欢
  • 1970-01-01
  • 2022-12-02
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多