【问题标题】:Return single row on case statement on left outer joined table在左外连接表上的 case 语句上返回单行
【发布时间】: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


【解决方案1】:

我一直在为您的问题寻找解决方案。事实证明 1000111 是正确的。如果没有全文搜索,您不能使用 Contains... 如果您将 Contains() 替换为 like,我认为这应该可以解决您的问题。这是我所做的:

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。

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

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      • 2014-08-13
      • 2017-09-28
      相关资源
      最近更新 更多