2017-04-25 121 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