Соединение таблиц на PostgreSQL - PullRequest
0 голосов
/ 27 апреля 2018

Я новичок здесь.

Я использую PostgreSQL для манипулирования большим количеством данных в моей конкретной области исследований. К сожалению, я столкнулся с проблемой, которая не позволяет мне продолжить анализ. Я попытался упростить свою проблему, чтобы наглядно проиллюстрировать ее.

Давайте предположим, что у меня есть таблица с названием "Покупатели" с этими данными: table_buyers

Покупатели могут сделать только одну покупку в каждом магазине или ни одной. Есть три магазина и есть стол для каждого. Как показано ниже:

table_store1

table_store2

table_store3

Для создания таблиц я использую следующий код:

CREATE TABLE public.buyer
(
ID integer NOT NULL PRIMARY KEY,
name text NOT NULL, 
phone text NOT NULL
) 
WITH (
  OIDS = FALSE
)
;

CREATE TABLE public.Store1
(
ID_buyer integer NOT NULL PRIMARY KEY,
total_order numeric NOT NULL, 
total_itens integer NOT NULL
) 
WITH (
  OIDS = FALSE
)
;


CREATE TABLE public.Store2
(
ID_buyer integer NOT NULL PRIMARY KEY,
total_order numeric NOT NULL, 
total_itens integer NOT NULL
) 
WITH (
  OIDS = FALSE
)
;


CREATE TABLE public.Store3
(
ID_buyer integer NOT NULL PRIMARY KEY,
total_order numeric NOT NULL, 
total_itens integer NOT NULL
) 
WITH (
  OIDS = FALSE
)
;

Чтобы добавить информацию в таблицы, я использую следующий код:

INSERT INTO buyer (ID, name, phone) VALUES
    (1, 'Alex', 88888888),
    (2, 'Igor', 77777777),
    (3, 'Mike', 66666666);

INSERT INTO Store1 (ID_buyer, total_order, total_itens) VALUES
    (1, 87.45, 8),
    (2, 14.00, 3),
    (3, 12.40, 4);

INSERT INTO Store2 (ID_buyer, total_order, total_itens) VALUES
    (1, 785.12, 7),
    (2, 9874.21, 25);

INSERT INTO Store3 (ID_buyer, total_order, total_itens) VALUES
    (2, 45.87, 1);

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

Обратите внимание: если покупатель ничего не покупал в магазине, я должен вывести «0».

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

Используя логический оператор «И», я попытался выполнить следующий код для выполнения этой задачи:

SELECT 
  buyer.id, 
  buyer.name, 
  store1.total_order, 
  store2.total_order, 
  store3.total_order
FROM 
  public.buyer, 
  public.store1, 
  public.store2, 
  public.store3
WHERE 
  buyer.id = store1.id_buyer AND
  buyer.id = store2.id_buyer AND
  buyer.id = store3.id_buyer;

Но, очевидно, он только что вернул «Игоря», так как это был единственный покупатель, который купил товары во всех трех магазинах ( печать экрана ).

Затем я попробовал логический оператор «ИЛИ», как и следующий код:

SELECT 
  buyer.id, 
  buyer.name, 
  store1.total_order, 
  store2.total_order, 
  store3.total_order
FROM 
  public.buyer, 
  public.store1, 
  public.store2, 
  public.store3
WHERE 
  buyer.id = store1.id_buyer OR
  buyer.id = store2.id_buyer OR
  buyer.id = store3.id_buyer;

Но затем он возвращает 12 строк с неправильными значениями ( печать экрана ).

Очевидно, что моя ошибка заключается в том, что я не считаю, что «Покупатели» не должны присутствовать во всех трех магазинах моего кода. Я просто не могу исправить это самостоятельно, не могли бы вы мне помочь?

Я очень благодарен за ответ, который может осветить мой путь. Большое спасибо!

Советы по поиску этой проблемы также приветствуются!

1 Ответ

0 голосов
/ 28 апреля 2018

Хорошо. Я сомневаюсь, что это окончательный ответ для вас, но это начало

SELECT 
  buyer.id, 
  buyer.name, 
  COALESCE( gb_store1.total_orders, 0 ) as store1_total, 
  COALESCE( gb_store2.total_orders, 0 ) as store2_total, 
  COALESCE( gb_store3.total_orders, 0 ) as store3_total
FROM
  public.buyer, 
  LEFT OUTER JOIN ( SELECT ID_buyer, 
                   SUM( total_orders ) as total_orders,
                   SUM( total_itens ) as total_itens
     FROM public.store1
     GROUP BY ID_buyer ) gb_store1 ON gb_store1.id_buyer = buyer.id ,
  LEFT OUTER JOIN ( SELECT ID_buyer, 
                   SUM( total_orders ) as total_orders,
                   SUM( total_itens ) as total_itens
     FROM public.store2
     GROUP BY ID_buyer ) gb_store2 ON gb_store2.id_buyer = buyer.id ,
  LEFT OUTER JOIN ( SELECT ID_buyer, 
                   SUM( total_orders ) as total_orders,
                   SUM( total_itens ) as total_itens
     FROM public.store3
     GROUP BY ID_buyer ) gb_store3 ON gb_store3.id_buyer = buyer.id ;

Итак, в этом запросе есть пара элементов, на которые следует обратить внимание. Подвыборки / groupby позволяют вам суммировать в ваших подтаблицах по ID_buyer. Функция LEFT OUTER JOIN делает это так, что ваш запрос все еще может вернуть результат, даже если подвыбор не находит подходящую запись. Наконец, COALESCE позволяет вам возвратить 0, когда один из ваших итогов равен NULL (так как подвыбор не нашел соответствия).

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...