我有一个评论表,其中OP有时会大声喊叫另一个发贴人(因此文本看起来像jest.mock('foo', () => jest.requireActual('../some/another/folder/foo.js'));
,其中ID是该线程中另一个发贴人的ID)。
我正在尝试提出某种查询,以便可以返回原始帖子并大声疾呼评论。我以为我可以通过递归查询来做到这一点,但我收到了错误代码。
'%@Id%'
这正在返回
消息512,级别16,状态1,第190行“子查询返回了1个以上 值。当子查询跟随<,>,> =,<=, =,!=或将子查询用作表达式时。”
关于我应该怎么做的任何想法?
答案 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
的多个评论一起加入。因此,这可能效率较低(但需要查看查询计划才能确定)。