在左外连接表上的case语句中返回单行

时间:2017-04-25 14:42:53

标签: sql sql-server duplicates left-join case

我有以下(简化)表格

表格产品

ID
Title

表格Data_Tags

ID
ForeignID
Tag

为产品ID 1添加了两个标签:' solid'和强大的

下面的查询将返回2行,如果我添加DISTINCT,它将只返回预期的1行。

SELECT  Products.ID, Products.Title
FROM    Products LEFT OUTER JOIN Data_Tags ON Products.ID = Data_Tags.ForeignID
WHERE  (Products.ID = 1)

我想在查询中添加一个CASE语句来计算与某些关键字的特定相关性

CASE WHEN CONTAINS(Data_tags.tag, 'solid') THEN 100 ELSE 0 END AS TagsMatch

查询将变为:

SELECT DISTINCT Products.ID, Products.Title, CASE WHEN CONTAINS(Data_tags.tag, 'solid') THEN 100 ELSE 0 END AS TagsMatch
FROM    Products LEFT OUTER JOIN Data_Tags ON Products.ID = Data_Tags.ForeignID
WHERE  (Products.ID = 1)

当运行查询时,它将返回两行,这非常有意义,因为它将为标记' solid'输出100。 (匹配)和0表示标签' strong' (不匹配)

但是我不确定如何修改查询只返回值为0的单行,如果没有相关的标记匹配则为100,如果任何相关的标记匹配则为100。

我还想避免使用子查询来尽可能保持最佳性能。

我正在使用MS SQL Server 2014。

请指教。非常感谢你!

2 个答案:

答案 0 :(得分:0)

我一直在努力为您的问题找到解决方案。事实证明1000111是正确的。你不能在没有全文搜索的情况下使用Contains ...如果用的话替换Contains()我认为这应该可以解决你的问题。这是我做的:

Declare @Products table 
  (ID int,
Title varchar(50))

insert into @Products values (1, 'Test')

Declare @Data_Tags table 
(ID int,
ForeignID int,
Tag varchar(50))

insert into @Data_Tags values (1, 1, 'solid')
insert into @Data_Tags values (2, 1, 'strong')


SELECT DISTINCT Products.ID, Products.Title, max(CASE WHEN Data_tags.tag like '%stttt%' THEN 100 ELSE 0 END) AS TagsMatch
FROM  @Products Products LEFT OUTER JOIN @Data_Tags Data_Tags ON Products.ID = Data_Tags.ForeignID
WHERE  (Products.ID = 1)
group by Products.ID, Products.Title

以上返回0,当您更改'%stttt%'到'%solid%'它返回100。

如果这有帮助,请告诉我。

答案 1 :(得分:0)

SELECT Products.ID, Products.Title, max(CASE WHEN Data_tags.tag = 'solid' THEN 100 ELSE 0 END) AS TagsMatch
FROM  @Products Products 
LEFT OUTER JOIN @Data_Tags Data_Tags 
    ON Products.ID = Data_Tags.ForeignID
WHERE  (Products.ID = 1)
group by Products.ID, Products.Title