我正在使用SQL Server 2012
。我有商店,不同的卖家放置他们的商品。不同的卖家可以放置相同的商品。例如。两个卖家可以把“iPhone”作为文章。我需要在商店里找到独特的商品。
我有两张桌子:
例如,如果三个卖家放置'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
(两个实体)。
你能建议SQL查询吗?
P.S。请不要建议更改DB结构并添加UniqueArticle表。我不能这样做,这是无用的,因为商店里的商品非常动态。
答案 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 强>