Sql 选择表内的多行(条件不同)

Sql 选择表内的多行(条件不同),sql,stored-procedures,Sql,Stored Procedures,我试图解释我现在面临的一个问题。 实际上,我已经设计了一个表来跟踪NLP引擎库中用户应用的更改 我有两个表名为Token和Lexeme。每个令牌都有一个直接连接到lexeme表行的id。我总是可以通过查找标记表找到最新和更新的词素 以下是他们的计划: Token Table: +-----+----------+----------+ | Id | token |LexemeId* | +-----+----------+----------+ LexemeId refers to a

我试图解释我现在面临的一个问题。 实际上,我已经设计了一个表来跟踪NLP引擎库中用户应用的更改

我有两个表名为Token和Lexeme。每个令牌都有一个直接连接到lexeme表行的id。我总是可以通过查找标记表找到最新和更新的词素

以下是他们的计划:

Token Table:
+-----+----------+----------+
| Id  | token    |LexemeId* |
+-----+----------+----------+
LexemeId refers to a row inside of lexeme table.
词素表:

+-----+---------------------+-------------+
| Id  | some information    |UpdatedFrom* |  
+-----+---------------------+-------------+
* UpdatedFrom field refers another row inside of Lexeme Table. 
Null表示不再有与此标记(lexeme)相关的行

例如:

Token Table:
+-----+----------+----------+
| 0   | A        |4         |
| 1   | B        |1         |
+-----+----------+----------+


Lexeme Table:

+-----+----------------------+-------------+
| 0   | A information#1      |NULL         |  
| 1   | B information        |NULL         |  
| 2   | A information#2      |0            |  
| 3   | A information#3      |2            |
| 4   | A information#4      |3            |    
+-----+----------------------+-------------+
我希望我能澄清事实。 我想编写一个存储过程来收集与每个令牌相关的所有记录。例如,对于标记“A”,我希望有一个数组(或数据表)如下所示:

+-----+----------------------+-------------+
| id  | informations         | updated from|
+-----+----------------------+-------------+
| 0   | A information#1      |NULL         |  
| 2   | A information#2      |0            |  
| 3   | A information#3      |2            |
| 4   | A information#4      |3            |    
+-----+----------------------+-------------+
有人有办法帮我吗

我对sql转录本的了解总结为更新、插入和选择语句,而不是更多


感谢高级…

假设这是在支持递归CTE的RDBMS中,请尝试:

with cte as 
(select t.id TokenId, t.token, l.Id, l.SomeInformation, l.UpdatedFrom
 from Token t
 join Lexeme l on t.LexemeId = l.id
 union all
 select t.TokenId, t.token, l.Id, l.SomeInformation, l.UpdatedFrom
 from cte t
 join Lexeme l on t.UpdatedFrom = l.id)
select Id, SomeInformation, UpdatedFrom
from cte
where TokenId=0 /* token = 'A' */

SQLFIDLE。

这是哪种RDBMS(MySQL、Oracle、SQLServer、PostgreSQL等)?您可以使用大多数RDBMS(通过递归公共表表达式)在单个查询中实现这一点,但MySQL将是一个例外。我不知道使用递归
是可能的。我在
oracle
下试用了它,这是我的世界,它仍然有效,但它需要一个列列表。然后,第一行将读取
,其中cte(token、id、someinformation、updatedfrom)为
@hol:是的,支持它们的RDBMS之间在递归CTE语法上有一些细微的差异——例如,在PostgreSQL中,您需要包含
recursive
关键字。我记得,Oracle在v11之前不支持递归CTE(Oracle 10有非递归CTE),但您可以使用
connectby
执行类似的操作。是的,我熟悉
connectby
,但在我看来这似乎要容易得多(至少在某些情况下)。@hol:我也是!不过,在旧版本的Oracle中使用
connectby
是很有用的。谢谢Mark,你的代码非常棒,我不知道SQL脚本上有这种功能。但是,正如我之前所说的,我正在开发一个NLP引擎,我想使用sql server来存储词汇表。在这段代码中,您假设每个标记都是唯一的,但在现实世界中,我们可以找到许多具有不同含义和发音的单词。例如“Patient(名词)”和“Patient(形容词)”,所以标记“A”不是唯一的。我想我应该通过在SQL之外编码来处理它。。。