0

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

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

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

ArticlePlacedBySeller : {Id: 1 , Description:'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

(两个实体)。

这是一个脚本

你能建议 SQL 查询来做到这一点吗?

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

4

1 回答 1

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 演示

演示与几篇文章

于 2013-06-16T13:41:04.967 回答