Oracle SQL - Где не существует и несколько объединений - PullRequest
0 голосов
/ 01 апреля 2020

Мне нужна помощь всем, кто знаком с Oracle SQL. Я пытаюсь использовать подзапрос «Где не существует», и работает нормально с указанными c пунктами where для указанных c клиентов, а затем с помощью UNION присоединиться к любому другому клиенту после этого. Я пытаюсь использовать SQL таким образом, чтобы я не использовал UNION для объединения нескольких клиентов, поскольку есть 100-е. Я просто не знаю, как go об этом.

Я думаю, мне нужно как-то присоединить таблицу MAIN_ITEM к таблице LOCATION, так как она связывает элементы в INVENTORY_LOCATIONS с кодом зоны, где может быть указан код местоположения по сравнению с таблицей ZONE, показаны любые несоответствия, когда location_code в INVENTORY_LOCATIONS не существует в таблице ZONE. Я не совсем уверен, правильно ли я объясняю это, но надеюсь, что мой пример ниже проясняет его.

Заранее большое спасибо.

Текущий запрос

select a.company, a.customer, c.customer_name, a.location_code, a.invt1, a.invt2, a.invt3, a.invt_qty
from inventory_locations a left join main_customer c
on a.company=c.company and a.customer=c.customer and a.ware_code=c.ware_code
where not exists (select 1 from zone b where b.location_code = a.location_code and b.zone_code='PM')
and a.company='M1'
and a.customer='100068'
UNION
select a.company, a.customer, c.customer_name, a.location_code, a.invt1, a.invt2, a.invt3, a.invt_qty
from inventory_locations a left join main_customer c
on a.company=c.company and a.customer=c.customer and a.ware_code=c.ware_code
where not exists (select 1 from zone b where b.location_code = a.location_code and b.zone_code='Z1')
and a.company='M1'
and a.customer='100012'

Таблица 1 - INVENTORY_LOCATIONS A

COMPANY | WARE_CODE |CUSTOMER   | LOCATION_CODE |INVT1  | INVT2 | INVT3     | INVT_QTY
--------------------------------------------------------------------------------------
M1      | 01        | 100012    | 0101A         |000052 | T100  | 000001001 | 60
M1      | 01        | 100012    | 0602A         |000053 | T101  | 000001002 | 60
M1      | 01        | 100068    | 0601A         |CANDY  | T200  | 000001080 | 25
M1      | 01        | 100068    | 0102A         |CANDY2 | T202  | 000001081 | 25

Таблица 2 - ZONE B

COMPANY | WARE_CODE |ZONE_CODE  | LOCATION_CODE
--------------------------------------------------------
M1      | 01        |PM         | 0101A
M1      | 01        |PM         | 0102A
M1      | 01        |Z1         | 0601A
M1      | 01        |Z1         | 0602A

Таблица 3 - MAIN_ITEM D

COMPANY | WARE_CODE | CUSTOMER   | ITEM_CODE    | ZONE_CODE
----------------------------------------------------------------
M1      | 01        | 100012    | 000052        | PM
M1      | 01        | 100012    | 000053        | PM
M1      | 01        | 100068    | CANDY         | Z1
M1      | 01        | 100068    | CANDY2        | Z1

Текущие результаты по вышеуказанному запросу.

COMPANY | CUSTOMER  | CUSTOMER_NAME | LOCATION_CODE | INVT1     | INVT2 | INVT3     | INVT_QTY
---------------------------------------------------------------------------------------------------
M1      | 100012    | TEST COMP 1   | 0602A         | 000053    | T101  | 000001002 | 60
M1      | 100068    | TEST COMP 2   | 0102A         | CANDY2    | T202  | 000001081 | 25

Ожидаемые результаты с запросом, который не использует UNION для объединения нескольких клиентов.

COMPANY | CUSTOMER   | CUSTOMER_NAME | LOCATION_CODE | INVT1    | INVT2 | INVT3     | INVT_QTY
-------------------------------------------------------------------------------------------------
M1      | 100012     | TEST COMP 1   | 0602A         | 000053   | T101  | 000001002 | 60
M1      | 100068     | TEST COMP 2   | 0102A         | CANDY2   | T202  | 000001081 | 25

Спасибо, что нашли время, чтобы прочитать и помочь. Очень признателен.

1 Ответ

1 голос
/ 01 апреля 2020

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

Однако моя интерпретация вашей цели состоит в том, чтобы найти, какие В строках инвентаризации подразумевается комбинация кода местоположения и зоны, отсутствующей в таблице зон.

Поэтому я бы сделал следующее:

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

  2. Затем возьмите комбинации кодов местоположения и зоны и посмотрите, какие из них отсутствуют в таблице зон с помощью Предложение «где не существует».

Заранее прошу прощения за любые опечатки / синтаксические ошибки. На самом деле, не выполняя его, я думаю, он выдаст запрошенный вывод.

with inv_loc as (
    select a.company, a.customer, c.customer_name, a.location_code, a.invt1, a.invt2, a.invt3, a.invt_qty, d.zone_code
    from inventory_locations a
    left join main_customer c on a.company=c.company and a.customer=c.customer and a.ware_code=c.ware_code
    left join main_item d on d.company = a.company and d.customer = a.customer and d.ware_code = a.ware_code and d.item_code = a.invt1
)
select
company, customer, customer_name, location_code, invt1, invt2, invt3, invt_qty
from inv_loc i
where not exists (
    select 1 from zone b
    where b.location_code = i.location_code and b.zone_code =i.zone_code
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...