开发者

Is it possible to retrieve an object that is split into three tables with only one query?

EDIT: The answers works, but slow down the query a lot. Is there another solution?


I have the following object in my program.

Page haves various TextBlock that haves various Token.

开发者_C百科

The three are stored in the database in three tables with the same namas of the objects.

I want to know if is possible to recover all the data needed to fill the object in the program with only one query.

I want only one query because I'm using a CURSOR to iterate over all the objects stored in the database.

The database scheme is this:

Page(id, someAttributes)

TextBlock(id,pageId, someAttributes)

Token(textblockId, someAttributes)


Assuming that every Page has at least one Textblock with at least one Token each try

SELECT * FROM
Page AS P 
INNER JOIN TextBlock T ON T.pageId = P.id 
INNER JOIN Token TK ON TK.textblockId = T.id;

Alternatively (old syntax):

SELECT * FROM
Page AS P, TextBlock T, Token TK WHERE 
T.pageId = P.id AND
TK.textblockId = T.id;

IF it is possible that the above condition is not always true then you need to use OUTER JOIN instead of INNER JOIN.


Yes it is possible with a 3 way join.

You'll get one row per Token in this case.

So you'll need to loop and fetch all rows from the cursor and appropriately create the objects as you see new Page ids, TextBlock ids, etc.

NOTE: You'll need to use outer joins, in case a TextBlock has no Tokens, so the TextBlock would still be retrieved (with null values for Token attributes). Same for Pages with no TextBlock.


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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜