Как разбить составной столбец как ROW, ARRAY? - PullRequest
0 голосов
/ 02 августа 2010

У меня такая же проблема с этой остановленной темой.

http://www.mail-archive.com/pgsql-sql@postgresql.org/msg28070.html

QUERY-1

SELECT 
r.id,
(
        SELECT 
        rl.reminder_header,
        rl.reminder_footer
        FROM reminder_levels AS rl
        WHERE rl.lookup =
        (
                SELECT MAX(reminder_level_lookup) 
                FROM reminders
                WHERE customer_id = r.customer_id
        )
)
FROM reminders AS r

Postgresql ответил, что:
ОШИБКА: подзапрос должен возвращать только один столбец

QUERY-2

SELECT 
r.id,
(
        SELECT 
        rl.reminder_header
        FROM reminder_levels AS rl
        WHERE rl.lookup =
        (
                SELECT MAX(reminder_level_lookup) 
                FROM reminders
                WHERE customer_id = r.customer_id
        )
) AS reminder_header,
(
        SELECT 
        rl.reminder_footer
        FROM reminder_levels AS rl
        WHERE rl.lookup =
        (
                SELECT MAX(reminder_level_lookup) 
                FROM reminders
                WHERE customer_id = r.customer_id
        )
) AS reminder_footer
FROM reminders AS r

id  |  reminder_header  |  reminder_footer
----+-------------------+--------------------
1   |  hogehoge         |  fugafuga

... который работает, но запускает дважды один и тот же блок подвыбора.
Это делает производительность убить.
(но мне нужна эта таблица результатов.)

QUERY-3

SELECT 
r.id,
(
        SELECT 
        ROW(rl.reminder_header, rl.reminder_header)
        FROM reminder_levels AS rl
        WHERE rl.lookup =
        (
                SELECT MAX(reminder_level_lookup) 
                FROM reminders
                WHERE customer_id = r.customer_id
        )
) AS rec
FROM reminders AS r

id  |  rec
----+----------------------
1   |  (hogehoge, fugafuga)

... что работает, но столбец 'rec' является составным.

Как разделить этот 'rec' на Remder_header и Remder_Footer, как Query-2.

Есть какая-то процедура или техника? или другое решение?

Спасибо.

Ответы [ 2 ]

1 голос
/ 03 августа 2010

Вы можете сделать так:

with query as ( 
SELECT 
r.id,
(
        SELECT 
        r1::reminder_levels
        FROM reminder_levels AS rl
        WHERE rl.lookup =
        (
                SELECT MAX(reminder_level_lookup) 
                FROM reminders
                WHERE customer_id = r.customer_id
        )
) AS rec
FROM reminders AS r)
select id,
       (rec::reminder_levels).reminder_header,
       (rec::reminder_levels).reminder_footer
from query
1 голос
/ 02 августа 2010

Чтобы выбрать несколько столбцов из подзапроса, вы обычно используете объединение. Сейчас я точно не знаю, как соотносятся ваши таблицы, но что-то вроде этого было бы хорошим началом:

SELECT  r.id
,       rl.reminder_header
,       rl.reminder_footer
FROM    reminders r
JOIN    reminder_levels AS rl
ON      rl.customer_id = r.customer_id
WHERE   rl.lookup =
        (
        SELECT  MAX(reminder_level_lookup) 
        FROM    reminders r2
        WHERE   r2.customer_id = r.customer_id
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...