Как использовать Order by пункт и лимит с union все в postgresql? - PullRequest
0 голосов
/ 18 декабря 2018

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

Подзапрос 1:

SELECT "bookings".* FROM "bookings"
WHERE "bookings"."guest_id" = 19317644 
    AND "bookings"."status" IN (0)
    AND (created_at > '2017-10-04 05:27:29.740508')
ORDER BY "bookings"."id" ASC LIMIT 1;

Подзапрос 2:

SELECT "bookings".* FROM "bookings"
WHERE "bookings"."guest_id" = 19317644 
    AND "bookings"."status" IN (1)
    AND (created_at > '2017-10-04 05:27:29.740508')
ORDER BY "bookings"."id" ASC LIMIT 1;

Я хочу показать всего одну запись из результатов обоих запросов.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Используйте CTE для консолидации данных

    WITH client_1 AS (
    SELECT "bookings".* FROM "bookings"
    WHERE "bookings"."guest_id" = 19317644 
        AND "bookings"."status" IN (0)
        AND (created_at > '2017-10-04 05:27:29.740508')
    ORDER BY "bookings"."id" ASC LIMIT 1
    ), client_2 AS (
    SELECT "bookings".* FROM "bookings"
    WHERE "bookings"."guest_id" = 19317644 
        AND "bookings"."status" IN (1)
        AND (created_at > '2017-10-04 05:27:29.740508')
    ORDER BY "bookings"."id" ASC LIMIT 1
    ), consolidated AS (
SELECT * FROM client_1 UNION ALL SELECT * FROM CLIENT_2
)
SELECT * FROM CONSOLIDATED;

, а затем сортируйте, ограничивайте или, где только с использованием "консолидированной" таблицы, будут данные из обоих запросов

0 голосов
/ 18 декабря 2018

Вы можете упорядочить результаты UNION, используя номер столбца в наборе результатов.Поэтому, если «id» - это первый столбец, возвращаемый из «select * from bookings», вы можете сделать это:

SELECT "bookings".* FROM "bookings"
WHERE "bookings"."guest_id" = 19317644 
    AND "bookings"."status" IN (0)
    AND (created_at > '2017-10-04 05:27:29.740508')

UNION ALL

SELECT "bookings".* FROM "bookings"
WHERE "bookings"."guest_id" = 19317644 
    AND "bookings"."status" IN (1)
    AND (created_at > '2017-10-04 05:27:29.740508')

ORDER BY 1

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

Наконец, я не уверен, что некоторые детали были потеряны, когда вы создавали свой пример, но это, вероятно, проще:

SELECT "bookings".* FROM "bookings"
WHERE "bookings"."guest_id" = 19317644 
    AND "bookings"."status" IN (0,1)
    AND (created_at > '2017-10-04 05:27:29.740508')

ОБНОВЛЕНИЕ:

если выЕсли вы хотите показать всего одну запись, то вы можете просто добавить предложение LIMIT в конец оператора.Например:

create table foo (a int);
insert into foo (a) values (1);
create table bar (b int);
insert into bar (b) values (2);

select * from foo
union all
select * from bar
order by 1
limit 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...