是否可以检索仅使用一个查询拆分为三个表的对象?

时间:2011-08-26 04:54:19

标签: java sql postgresql cursor

编辑:答案有效,但查询速度很慢。还有其他解决方案吗?


我的程序中有以下对象。

Page有各种TextBlockToken

这三个数据库存储在数据库中的三个表中,这些表具有相同的对象namas。

我想知道是否有可能只用一个查询来恢复填充程序中对象所需的所有数据。

我只想要一个查询,因为我使用CURSOR来迭代存储在数据库中的所有对象。

数据库方案是这样的:

Page(id, someAttributes)
TextBlock(id,pageId, someAttributes)
Token(textblockId, someAttributes)

3 个答案:

答案 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