编辑:答案有效,但查询速度很慢。还有其他解决方案吗?
我的程序中有以下对象。
Page
有各种TextBlock
个Token
。
这三个数据库存储在数据库中的三个表中,这些表具有相同的对象namas。
我想知道是否有可能只用一个查询来恢复填充程序中对象所需的所有数据。
我只想要一个查询,因为我使用CURSOR
来迭代存储在数据库中的所有对象。
数据库方案是这样的:
Page(id, someAttributes)
TextBlock(id,pageId, someAttributes)
Token(textblockId, someAttributes)
答案 0 :(得分:1)
是的,可以通过3方式加入。
在这种情况下,每个令牌会获得一行。
所以你需要循环并从光标中获取所有行,并在看到新的Page ids,TextBlock id等时适当地创建对象。
注意:如果TextBlock没有Tokens,您将需要使用外连接,因此仍将检索TextBlock(Token属性的值为null)。没有TextBlock的页面也是如此。
答案 1 :(得分:1)
假设每个页面至少有一个文本块至少有一个令牌,每次尝试
SELECT * FROM
Page AS P
INNER JOIN TextBlock T ON T.pageId = P.id
INNER JOIN Token TK ON TK.textblockId = T.id;
或者(旧语法):
SELECT * FROM
Page AS P, TextBlock T, Token TK WHERE
T.pageId = P.id AND
TK.textblockId = T.id;
如果上述情况可能并非总是如此,那么您需要使用OUTER JOIN
代替INNER JOIN
。
答案 2 :(得分:0)
Select
Page.someAttributes,
TextBlock.someAttributes,
Token.someAttributes
From
Page,
TextBlock,
Token
Where
Page.id = TextBlock.pageId
AND
TextBlock.id = Token.textblockId
Group By
Page.id