Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > [PostgreSQL ]Объединение блоков данных.


Автор: mastercz 24.12.2010, 02:36
Добрый день. 
Подскажите пожалуйста, как написать функцию  решающую следующую задачу. 
Краем сознания чувствую решение существует, но немогу его нащупать smile 
Приведу  пример. 
Заранее благоден за помощь.

Есть таблица [person] содержащая список людей. 
Код

[person]
 (id)     (content)
  1       Иванов
  2       Петров


 Есть таблица [person_address]  содержащая ссылки на записи в [person].
Код

[person_address] 
  (id)     (address)       (person_id)
    1        дом1              1
    2        дом2              1
    3        дом1              2
    4        дом3              2



 Есть таблица [actions] содержащая  ссылки на записи в [person] и в [person_address]
Код

[action] 
  (id)     (person_address_id)       (person_id)    (actions)
    1             1                   1             зевнул
    2             2                   1             заснул
    3             3                   2             гуляет
    4             4                   2             спит


1.Необходимо передать [person_address] от Петрова к Иванову без дубликатов
Код

[person_address] 
  (id)     (address)       (person_id)
    1        дом1              1
    2        дом2              1
    4        дом3              1


2. Необходимо передать [actions] от Петрова к Иванову перепривязав адрес где это необходимо
Код

[action]
  (id)     (person_address_id)       (person_id)    (actions)
    1             1                    1             зевнул
    2             2                    1             заснул
    3             1                    1             гуляет
    4             4                    1             спит


Автор: Abbath1349 12.1.2011, 13:54
Может соединить их Right JOIN или LEFT JOIN хотя наверно ошибаюсь

Автор: Deniz 13.1.2011, 07:04
Выбрать все адреса Петрова, которых нет у Иванова
Код
select pa1.address
from person_address pa1
where (pa1.person_id = 2)
  and (pa1.address not in (select address from person_address where person_id = 1))

Автор: Akina 13.1.2011, 09:04
У Вас имеются избыточные связи - в таблице actions полю-ссылке на person быть не положено. Образуется цикл и потенция противоречивости. Удалите.
Тогда выполнение первой части задачи автоматически выполнит и вторую её часть.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)