2014-02-20 7 views
0

Позвольте мне сначала начать с заявления, что за последние две недели я получил ENORMOUS-помощь от всех вас (хорошо, а не все ... но я думаю, возможно, два десятка человек прокомментировали , и почти все эти комментарии были полезными). Это действительно потрясающе, и я думаю, что это показывает, что команда stackoverflow действительно сделала что-то БОЛЬШОЕ вообще. Так спасибо всем!Выполнение нескольких запросов в Postgresql - условная петля

Теперь, как некоторые из вас знают, я сейчас работаю в кампусе, и мне нужно использовать машину для окон. (Я единственный, кто должен использовать окна здесь ... :()

Теперь мне удается настроить (хорошо, ИТ-отдел сделал это для меня) и заполнить базу данных Postgres (это я сделал сам) , причем около 400 мб данных, что, возможно, не столько для большинства из вас, сколько для пользователей Ppostgre, но я больше привык к базе данных sqlite для личного использования, которая редко превышала 2 МБ.

В любом случае, извините за то, что вы так болтливы -. Теперь запросы из этой базы данных работы славно я использую рубин делать запросы на самом деле

записи в базе данных Postgres взаимосвязаны, настолько, насколько они похожи «указатели». - й у них есть одно поле, указывающее на другое поле.

Пример: Ввод 3667 пунктов для входа 35785, который указывает на ввод 15566. Так что это довольно просто.

Основная запись - 1, поэтому конец всех этих запросов равен 1. Таким образом, из любого другого числа мы можем достичь 1 в конце в качестве последнего результата.

Я использую ruby, чтобы сделать так много индивидуальных запросов к базе данных до тех пор, пока не будет возвращен последний результат 1. Это может занимать до 10 индивидуальных запросов. Я делаю это, войдя в psql с моим паролем и данными, а затем выполнив SQL-запрос через -c. Это, вероятно, не идеально, для выполнения этих логинов и запросов требуется немного времени, и в идеале мне нужно будет войти только один раз, выполнить ВСЕ запросы в Postgres, а затем выйти с результатом (все эти записи будут результатом).

Теперь вот мой вопрос: - Есть ли способ сделать условные запросы все внутри Postgres?

Я знаю, как это сделать в сценарии оболочки и в рубине, но я не знаю, доступно ли это в postgresql.

мне нужно сделать запрос, в буквальном английском, например, так:

«Пожалуйста, дайте мне все записи, которые указывают на родительскую запись, пока последний найденная запись не является в конечном счете 1, а затем вернуть все эти записи ».

Я уже «решил» его, используя ruby, чтобы сделать несколько запросов до тех пор, пока не будет возвращено 1, но это поражает меня как довольно неэлегантное и, возможно, неэффективное.

Любая информация очень ценится - спасибо!

Edit (Argh, я не при склеивании ...):

Пример набора данных, таблица будет выглядеть так:

id |  parent 
----+---------------+ 
    1 |    1 | 
    2 |  131567 | 
    6 |  335928 | 
    7 |    6 | 
    9 |    1 | 
10 |  135621 | 
11 |    9 | 

Я надеюсь, что работает, я пытался сузить это исключительно на примере.

Например, идентификатор 11 указывает на идентификатор 9, и ИН 9 указывает идентификатор 1.

Было бы здорово, если бы можно было бы использовать SQL для возврата: 11 -> 9 -> 1

+2

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

+0

Хорошо, давайте посмотрим: hmm ... – shevy

+0

Я добавил примерную таблицу выше - конечно, это намного проще, чем реальная таблица базы данных (которая имеет размер около 240 МБ). – shevy

ответ

2

Если вы не дадите несколько примеров таблиц, то, что вы просите, смутно напоминает древовидную структуру, которую можно манипулировать с помощью рекурсивных запросов: http://www.postgresql.org/docs/8.4/static/queries-with.html.

+0

Этот ответ состоит в основном из ссылки. [Было бы желательно] (http://meta.stackexchange.com/a/8259) включить сюда основные части ответа и просто предоставить ссылку для дополнительной ссылки. Если вы не справитесь с этой задачей, вы должны просто рассмотреть [оставить комментарий] (http://stackoverflow.com/privileges/comment) в вопросе, а не публиковать ответ. – Dukeling

+0

Я добавил примерное определение таблицы выше. Таблица имеет два столбца, называемых id и parent. Результатом каждого идентификатора является родительский идентификатор, который указывает на другой идентификатор, который может указывать на другой идентификатор, пока не будет достигнут основной идентификатор 1. Это очень просто в рубине, это просто хэш в основном. Я не уверен, что это можно сделать в postgresql. – shevy

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