2017-04-25 120 views
2

我有以下的(简化)表在左外连接表

表产品

ID 
Title 

表Data_Tags

ID 
ForeignID 
Tag 

上有case语句返回单行为产品ID 1添加两个标签:'固体'和'强'

下面的查询将返回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) 

当运行查询,它将返回两行,这是非常有意义的,因为它将输出100代表'固体'(匹配)和0代表'强'(不匹配)标签

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

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

我正在使用MS SQL Server 2014.

请指教。非常感谢你!

+1

使用'MAX(CASE ....)'和'集团通过Product.ID' – 1000111

+0

一起当我尝试这种情况发生时的错误:“全文谓词不能出现在aggegrate表达。将聚合表达式放在子查询' – Onthrax

+0

中您使用了错误的标签。而是标记'SQL-SERVER'并删除'MySQL' – 1000111

回答

0

我一直在试图为您的问题找到解决方案。事实证明,1000111是正确的。你不能使用包含全文搜索...如果你用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%”改为“%固体%”返回100

让我知道,如果这有助于。

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