从链接中选择唯一项目

时间:2013-06-16 11:43:55

标签: sql sql-server

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

  1. ArticlePlacedBySeller {Id,Description,...}
  2. LinkBetweenArticles {Id,Article1,Article2}
  3. 例如,如果三个卖家放置'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不通过描述的一部分链接(其中描述如'%...%')。 (此脚本的结果必须是:

      

    ArticlePlacedBySeller :Id: 1 ,Id: 4

    (两个实体)。

    Here is a script

    你能建议SQL查询吗?

    P.S。请不要建议更改DB结构并添加UniqueArticle表。我不能这样做,这是无用的,因为商店里的商品非常动态。

1 个答案:

答案 0 :(得分:2)

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

;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