【问题标题】:Selecting unique items from linked从链接中选择唯一项目
【发布时间】:2013-06-16 21:41:04
【问题描述】:

我正在使用SQL Server 2012。我有商店,不同的卖家放置他们的商品。不同的卖家可以放置相同的商品。例如。两个卖家可以将“iPhone”作为文章。我需要在商店里找到独特的商品。 我有两张桌子:

  1. ArticlePlacedBySeller {Id, Description, ...}
  2. LinkBetweenArticles {Id, Article1, Article2 }

例如,如果三个卖家放置了“iPhone”和一个“iPhone 2”,我们将看到:

ArticlePlacedBySeller:{Id:1,描述:'iPhone super'}; {2, 'iPhone 最佳'}; {3, 'iPhone 新品牌'}; {4,“iPhone 2”}

LinkBetweenArticles:{Id:1,Article1:1,Article2:2}; {2, 2, 1}; {3, 2, 3}; {4, 3, 2}; {5, 3, 1}; {6, 1, 3};

如您所见,只有前三种商品相互关联。第四篇文章未链接。现在我们只需要从 ArticlePlacedBySeller 中选择这 3 种商品中的一种(无论具体是什么)和 1 种未通过部分描述链接的商品(其中 Description like '%...%')。 (此脚本的结果必须是:

ArticlePlacedBySeller:ID:1,ID:4

(两个实体)。

Here is a script

您能否建议使用 SQL 查询来执行此操作?

附:请不要建议更改数据库结构并添加 UniqueArticle 表。我不能这样做,这没有用,因为商店里的商品非常动态地变化。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    这样的方法适用于特定情况,但可能需要对更大的样本数据进行额外测试。它还假设您的链接始终是双向的。

    ;WITH CTE_Links AS 
    (
        SELECT Article1, MIN(Article2) Article2
        FROM dbo.LinkBetweenArticles
        GROUP BY Article1
        HAVING Article1 > MIN(Article2)
    )
    SELECT a.* 
    FROM dbo.ArticlePlacedBySeller a
    LEFT JOIN CTE_Links l ON a.Id = l.Article1
    WHERE l.Article2 IS NULL
    

    SQLFiddle Demo

    Demo with few more articles

    【讨论】:

      猜你喜欢
      • 2020-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多