Abe*_*ler 3 sql sql-server sql-server-2008
我正在尝试编写一些SQL,它将接受一组字母并返回它可以生成的所有可能的单词.我的第一个想法是创建一个基本的三个表数据库,如下所示:
Words -- contains 200k words in real life
------
1 | act
2 | cat
Letters -- contains the whole alphabet in real life
--------
1 | a
3 | c
20 | t
WordLetters --First column is the WordId and the second column is the LetterId
------------
1 | 1
1 | 3
1 | 20
2 | 3
2 | 1
2 | 20
Run Code Online (Sandbox Code Playgroud)
但我有点担心如何编写一个查询,返回在每个传入的字母中返回WordLetters条目的单词.它还需要考虑具有两个相同字母的单词.我从这个查询开始,但它显然不起作用:
SELECT DISTINCT w.Word
FROM Words w
INNER JOIN WordLetters wl
ON wl.LetterId = 20 AND wl.LetterId = 3 AND wl.LetterId = 1
Run Code Online (Sandbox Code Playgroud)
我如何编写一个查询来只返回包含所有传入的字母和重复字母的单词?
其他信息:
我的Word表包含近200,000个单词,这就是我试图在数据库端而不是在代码中执行此操作的原因.如果有人关心,我正在使用enable1单词列表.
暂时忽略问题的SQL部分,我使用的算法非常简单:先从你的字典中取出每个单词,然后按照排序顺序生成一个带有字母的版本,再加上一个指针返回到该单词的原始版本.
这将为表提供如下条目:
sorted_text word_id
act 123 /* we'll assume `act` was word number 123 in the original list */
act 321 /* we'll assume 'cat' was word number 321 in the original list */
Run Code Online (Sandbox Code Playgroud)
然后,当我们收到一个输入(比如说"tac")时,我们对它的字母进行排序,在我们的表格中查找它们,这些字母表连接到原始单词的表格,并且它给出了一个可以从中创建的单词的列表.那个输入.
如果我这样做,我会在SQL数据库中有这些表,但可能会使用其他东西将单词列表预处理为已排序的表单.同样,我可能会将用户输入的字母排序为我用于创建前端的任何内容,因此SQL可以做它擅长的事情:关系数据库管理.