2013-02-23 5 views
1

Я пытаюсь сохранить следующие данные в таблице, где visible_to является многозначным атрибутом.Использование вложенных запросов: SQL

Wall_ID Facebook_ID Visible_To 
W1  F1   F2,F3,F4 
W2  F2   F1 
W3  F3   F1 
W4  F4   F1 

Я пытаюсь подражать Facebook на Oracle. Я хочу найти пользователя, который может просматривать max no другой стены (здесь: F1).

Я дошел до хранения многозначного атрибута, используя таблицу NESTED в Oracle 11g. Должен ли я развернуть таблицу, чтобы найти результат запроса, или есть другой способ сделать это?

Спасибо!

+2

Единственное другое решение, о котором я могу думать, это хранить Visible_to в отдельной таблице с помощью Wall_ID как внешнего ключа. –

+0

Этот сценарий будет намного проще реализовать с помощью базы данных NOSQL. Особенно, если у вас много соединений с другими наборами данных, производительность будет намного лучше. – Xander

+0

Привет, это для простой БД с максимальным количеством десяти записей. Есть ли способ продолжить метод вложенных таблиц и ответить на запрос? –

ответ

1

Если я понять, что вы пытаетесь сделать правильно, то что-то подобное должно работать (Пожалуйста, обратитесь к SQL Fiddle):

SELECT * 
FROM (
    SELECT 
    f.wall_id 
    , f.facebook_id 
    , COUNT(t.COLUMN_VALUE) visible_to_count 
    FROM facebook_data f 
    CROSS JOIN TABLE(f.visible_to) t 
    GROUP BY f.wall_id, f.facebook_id 
    ORDER BY visible_to_count DESC 
) 
WHERE ROWNUM = 1 

Results:

| WALL_ID | FACEBOOK_ID | VISIBLE_TO_COUNT | 
-------------------------------------------- 
|  W1 |   F1 |    3 | 

Это просто разворачивает вложенную таблицу и затем агрегирует, чтобы вы могли подсчитать количество значений. Вы также можете подумать о добавлении ключевого слова DISTINCT в функцию COUNT(), если вы, вероятно, сохраните повторяющиеся значения или иным образом внесите мощность в запрос.

+0

О, спасибо. Это прекрасно :') –

Смежные вопросы