【问题标题】:How to write an SQL query that searches for a group of words from another table?如何编写一个从另一个表中搜索一组单词的 SQL 查询?
【发布时间】:2011-10-31 09:32:28
【问题描述】:

我正在尝试为 Stack Exchange 自己的 Data Explorer 编写查询。此查询将创建一个临时表,其中包含常见拼写错误的单词及其正确拼写的列表,然后搜索帖子以找到它们。

这是我目前所拥有的(减去 cmets):

DECLARE @SpellingMistakes TABLE (wrong VARCHAR(255), right VARCHAR(255))

INSERT INTO @SpellingMistakes (wrong, right)
VALUES ('ubunut', 'ubuntu')

SELECT Id as [Post Link]
FROM Posts
WHERE
    ...

这就是我陷入困境的地方 - 在WHERE 子句中。我需要某种方式来表达“如果Posts.Body 包含@SpellingMistakes.wrong 中的任何一个”。但是,我不知道该怎么做。

注意:数据浏览器使用 Microsoft SQL Server 2008 R2。

【问题讨论】:

  • 一个糟糕的方法是Posts.Body like + '%' +( select SpellingMistakes.wrong from SpellingMistakes) + '%' - 类似的东西 - 不确定它是否是正确的语法
  • 可悲的是Cannot use a CONTAINS or FREETEXT predicate on table or indexed view 'Posts' because it is not full-text indexed.
  • 我认为数据浏览器使用 Azure,不如 2008 R2 功能全面。 SO的后端是SQL Server...
  • @OMGPonies 他们已从 Azure 中移出 blog.stackoverflow.com/2010/12/…

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

我不知道 MS SQL,但大多数 SQL 实现都有“LIKE”等价物。因此,在这种情况下,您可以连接两个表并在 JOIN 条件中使用 LIKE。

SELECT Id as link
FROM Posts P JOIN SpellingMistakes S
ON P.Body LIKE '%'+S.wrong+'%'

编辑:假设Posts 是一个大表(SpellingMistakes 也不是太小),这将占用大量资源。解决此问题的一种方法是将表 Posts 拆分为更小的子集并构造多个语句。

SELECT Id as link
FROM (SELECT * FROM Posts WHERE Id<=10000) P 
JOIN 
SpellingMistakes S
ON P.Body LIKE '%'+S.wrong+'%'

SELECT Id as link
FROM (SELECT * FROM Posts WHERE Id<=20000 and Id>10000) P 
JOIN    
SpellingMistakes S
ON P.Body LIKE '%'+S.wrong+'%'

等等。

【讨论】:

  • 我做了类似的事情,服务器窒息声称(在错误消息中)它“资源不足”。我可以确定此查询不会使用大量资源吗?
  • @GeorgeEdison 加入 2 个大表总是会占用大量资源 [O(nm)]。我现在想不出任何其他的解决方案。我通常进行大表连接的方式是将连接分解为多个语句,每个语句使用较大表的较小子集。因此,在这种情况下,如果您可以在表Posts 上指定一个条件以仅提取一个子集,那么JOIN 应该能够使用更少的资源。
【解决方案2】:
SELECT Id as PostLink
FROM Posts p
WHERE   
EXISTS 
     (
      SELECT * 
      FROM @SpellingMistakes 
      WHERE p.Body LIKE '%' + wrong + '%' 
      )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 2022-01-19
    • 2011-03-09
    相关资源
    最近更新 更多