使用LIKE和子查询的值列表

时间:2019-07-05 20:08:34

标签: sql-server

我有一个评论表,其中OP有时会大声喊叫另一个发贴人(因此文本看起来像jest.mock('foo', () => jest.requireActual('../some/another/folder/foo.js'));,其中ID是该线程中另一个发贴人的ID)。 我正在尝试提出某种查询,以便可以返回原始帖子并大声疾呼评论。我以为我可以通过递归查询来做到这一点,但我收到了错误代码。

'%@Id%'

这正在返回

  

消息512,级别16,状态1,第190行“子查询返回了1个以上   值。当子查询跟随<,>,> =,<=,   =,!=或将子查询用作表达式时。”

关于我应该怎么做的任何想法?

2 个答案:

答案 0 :(得分:0)

我认为这会让您接近:

SELECT p.CreatedBy AS OP, 
p.Post AS FirstPost, 
c.Comment AS ShoutOut
FROM Posts p 
INNER JOIN Comments c 
  ON p.Id=c.PostId
INNER JOIN Comments so
  ON CHARINDEX(c.Comment,'%@' + cast(so.Id as varchar(8)) + '%') > 0
WHERE p.CreatedBy=c.CreatedBy

答案 1 :(得分:0)

LIKE是两个标量值的运算符,因此它期望右侧是单个值。但是查询返回很多-因此您会收到错误消息。

您需要一个LIKE条件(尽管我附近没有SqlServer来检查语法),而不是单个EXISTS,该条件检查cc中是否有满足以下条件的其他注释:赞条件:

...  
AND EXISTS (SELECT 1 FROM Comments cc 
            WHERE cc.PostId = p.Id AND 
                c.Comment LIKE '%' + cc.CreatedBy + '%')

另一种表达方式是3向JOIN:

SELECT p.CreatedBy AS OP, p.Post AS FirstPost, c.Comment AS ShoutOut
FROM Posts p 
INNER JOIN Comments c ON p.Id = c.PostId
INNER JOIN Comments cc ON p.Id = cc.PostId
WHERE p.CreatedBy = c.CreatedBy AND 
      c.Comment LIKE '%' + cc.CreatedBy + '%'
GROUP BY OP, FirstPost, ShootOut

此版本需要使用GROUP BY来消除重复-因为单个ShootOut可能与同一作者的cc的多个评论一起加入。因此,这可能效率较低(但需要查看查询计划才能确定)。