【问题标题】:Using LIKE with list of values from subquery将 LIKE 与子查询中的值列表一起使用
【发布时间】:2019-07-05 20:08:34
【问题描述】:

我有一张评论帖子表,其中偶尔会有 OP “喊出”另一张海报(因此文本看起来像 '%@Id%',其中 ID 是该线程中另一张海报的 ID)。 我正在尝试提出某种查询,以便我可以返回原始帖子并喊出 cmets。我想我可以用递归查询来做到这一点,但我得到了一个错误代码。

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
    WHERE p.CreatedBy=c.CreatedBy AND c.Comment LIKE '%' + 
        (SELECT cc.CreatedBy
            FROM Comments cc
            WHERE cc.PostId=p.Id) + '%'

这是返回

Msg 512, Level 16, State 1, Line 190 "子查询返回超过 1 个 价值。当子查询跟随 、>=、

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

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    LIKE 是两个标量值的运算符,因此它期望右侧是单个值。但是查询返回很多 - 所以你得到一个错误。

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

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

    另一种表达方式是 3-way 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 的多个 cmets 连接。所以这可能效率较低(但需要查看查询计划才能确定)。

    【讨论】:

    • 太棒了,三向连接效果很好。谢谢!!我是否有理由使用 GROUP BY 而不是 SELECT DISTINCT?
    • SELECT DISTINCT 也应该在这里工作,绝对。可能相同的执行计划,但 SELECT DISTINCT 更惯用,你是对的。
    • 另外,如果有效,请将其标记为答案 - 当下一个人找到此任务时,社区会这样做。
    【解决方案2】:

    我认为这会让你接近:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 2014-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多