【发布时间】:2017-09-22 15:44:03
【问题描述】:
我有以下(简化的)表格
餐桌产品
ID
Title
表格数据_标签
ID
ForeignID
Tag
为产品 ID 1 添加了两个标签:“solid”和“strong”
下面的查询将返回 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,为标签“strong”(不匹配)输出 0
但是我不确定如何修改查询以仅在没有相关标签匹配时返回值为 0 的单行,如果任何相关标签匹配则返回值为 100。
我还想避免子查询以尽可能保持最佳性能。
我使用的是 MS SQL Server 2014。
请指教。非常感谢!
【问题讨论】:
-
使用
Max(CASE....)和Group By Product.ID -
当我尝试这个时会发生错误:'全文谓词不能出现在聚合表达式中。将聚合表达式放在子查询中'
-
您使用了错误的标签。而是标记
SQL-SERVER并删除MySQL -
我的错。更正了标签。
标签: sql sql-server duplicates left-join case