Можно ли получить объект, который разделен на три таблицы только с одним запросом? - PullRequest
0 голосов
/ 26 августа 2011

РЕДАКТИРОВАТЬ : ответы работают, но сильно замедляют запрос.Есть ли другое решение?


У меня есть следующий объект в моей программе.

Page имеет различные TextBlock, которые имеют различные Token.

Эти три хранятся в базе данных в трех таблицах с одинаковыми намасами объектов.

Я хочу знать, возможно ли восстановить все данные, необходимые для заполнения объекта в программе, только одним запросом.

Мне нужен только один запрос, потому что я использую CURSOR для перебора всех объектов, хранящихся в базе данных.

Схема базы данных такова:

Page(id, someAttributes)<br> TextBlock(id,pageId, someAttributes)<br> Token(textblockId, someAttributes)

Ответы [ 3 ]

1 голос
/ 26 августа 2011

Предполагая, что на каждой странице есть хотя бы один текстовый блок с хотя бы одним токеном, каждая попытка

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.

1 голос
/ 26 августа 2011

Да, это возможно при трехстороннем соединении.

В этом случае вы получите по одной строке на каждый токен.

Так что вам нужно будет выполнить цикл и извлечь все строки изнаведите курсор и соответствующим образом создайте объекты так, как вы видите новые идентификаторы страниц, идентификаторы TextBlock и т. д.

ПРИМЕЧАНИЕ. Вам потребуется использовать внешние объединения, если в TextBlock нет токенов, поэтому TextBlock все равно будет получен(с нулевыми значениями для атрибутов токена).То же самое для страниц без TextBlock.

0 голосов
/ 26 августа 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...