Выберите отдельные значения из объединения - PullRequest
0 голосов
/ 17 мая 2018

У меня есть три таблицы (заказы на продажу, счета-фактуры, заказы на покупку)

sales_order
------------
so_id (primary key)
item_id (foreign key)
entry_date

invoice
------------
invc_id (primary key)
item_id (foreign key)
entry_date

purchase_order
------------
po_id (primary key)
item_id (foreign key)
entry_date

, и все они относятся к одной центральной таблице (номенклатуре):

item_id (pk)

Я пытаюсьнаписать SQL-запрос, который будет возвращать все элементы с активностью в диапазоне дат.

Вот что я придумал:

select distinct item_id from sales_order where entry_date between ? and ?
union
select distinct item_id from invoice where entry_date between ? and ?
union
select distinct item_id from purchase where entry_date between ? and ?

Я думаю, что это правильное решение, ноЯ не уверен, как это проверить.

Вопрос 1. Применяется ли ключевое слово «отдельный» ко всем операторам или только к каждому утверждению?т. е. будет ли каждый запрос возвращать отдельный набор, но когда вы «объедините» их вместе, он может показать дубликаты?

Вопрос 2. Есть ли способ вернуть общее (уникальное) количество элементов (в виде отдельного запроса)??Как:

select count(
    select distinct item_id from sales_order where entry_date between ? and ?
    union
    select distinct item_id from invoice where entry_date between ? and ?
    union
    select distinct item_id from purchase where entry_date between ? and ?
)

??

1 Ответ

0 голосов
/ 17 мая 2018

distinct является избыточным. Я обычно пишу такой запрос как:

select item_id from sales_order where entry_date between ? and ?
union  -- intentionally removing duplicates
select item_id from invoice where entry_date between ? and ?
union
select item_id from purchase where entry_date between ? and ?;

Чтобы вернуть общее количество, вы можете использовать подзапрос:

select count(*)
from (select item_id from sales_order where entry_date between ? and ?
      union  -- intentionally removing duplicates
      select item_id from invoice where entry_date between ? and ?
      union
      select item_id from purchase where entry_date between ? and ?
     ) i;
...