Невозможно объединить две таблицы с лимитом в Postgres - PullRequest
0 голосов
/ 25 марта 2019

У меня есть таблица A с col1, col2, col3 и таблицей B col1.

Я хочу объединить обе таблицы, используя ограничение

Я хочу что-то вроде

select a.col1,a.col2,a.col3,b.col1 
from tableA a, tableB b limit 5 and a.col1 between 1 AND 10;

Итак, у меня есть 10 записей в таблице b и 10 в таблице a. Я должен получить всего 50 записей, ограничив только 5 записей из таблицы b

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

Ваше описание переводится как CROSS JOIN:

SELECT a.col1, a.col2, a.col3, b.b_col1  -- unique column names
FROM   tablea a
CROSS  JOIN ( SELECT col1 AS b_col1 FROM tableb LIMIT 5 ) b;
-- WHERE  a.col1 BETWEEN 1 AND 10;  -- see below

... и LIMIT для tableb, как a_horse уже продемонстрировал. LIMIT без ORDER BY возвращает произвольные строки. Результат может меняться от одного исполнения к другому.

Для выбора случайных строк из tableb:

...
CROSS JOIN ( SELECT col1 AS b_col1 FROM tableb <b>ORDER BY random()</b> LIMIT 5) b;

Если ваш стол большой , рассмотрите:

Пока ты ...

имеют 10 записей в ... таблице а

... добавленное условие WHERE является избыточным или неправильным для получения 50 строк.

И хотя SQL это позволяет, редко имеет смысл иметь несколько столбцов результатов с одним и тем же именем. Некоторые клиенты сразу выдают ошибку. Используйте псевдоним столбца, чтобы сделать имена уникальными.

0 голосов
/ 26 марта 2019

Для этого вам нужна производная таблица (также называемая «подзапросом»). В производной таблице вы можете ограничить количество строк.

select a.col1, a.col2, b.col3, b.col1
from tablea a
  join (
    select b.col3, b.col1
    from tableb
    limit 5 -- makes no sense without an ORDER BY
  ) b on b.some_column = a.some_column --<< you need a join condition
where a.col1 between 1 and 10;

Обратите внимание, что использование LIMIT без ORDER BY обычно не имеет смысла.

...