Создание выборки itms, которые являются результатом (положительное объединение двух таблиц над третьей) и (отрицательное объединение двух таблиц над третьей) - PullRequest
0 голосов
/ 25 апреля 2019

Я хочу получить выбор всех товаров (ART.ARTKEYI), которые назначены элементу (PRO.PROKEYI), но элемент которого не назначен ни одному магазину (PSZ.PSZPROKEYI).

БД структурирована так:

Таблица AEZ связывает Статьи (ART.ARTKEYI = 1234) и Элементы (PRO.PROKEYI = 9876)

AEZ:

AEZPROKEYI   <-->   AEZARTKEYI

   9876________________1234

Таблица PSZ соединяет элементы (PRO.PROKEYI) и магазины (SHO.SHOKEYI)

ПСЗ:

PSZSHOKEYI <--> PSZPROKEYI

9999999999________9876

Я хочу выбрать все ART.ARTKEYI (и ART.ARTBEZC, если это возможно), присутствующие в AEZ.AEZARTKEYI (имеющие соответствующий AEZPROKEYI), но только если AEZPROKEYI отсутствует в PSZ.PSZPROKEYI

Я попытался сделать следующий выбор (но я не совсем уверен, может ли это вообще сработать!)

<SQL>
SELECT DISTINCT
artkeyi, artbezc, prokeyi
FROM ART, pro, aez




where 

 aez.aezartkeyi = art.artkeyi
 and
 aez.aezprokeyi = pro.prokeyi
and
proetykeyi = 1 /* only Elements of the 'Product' type*/
 and


not exists (select 1 from CMKAT.pro, psz where pro.prokeyi = 
PSZ.pszprokeyi)
    ;
</SQL>

Я получаю подборку всех статей (миллионы). Должно быть ограничено несколькими тысячами.

Это должно быть включено в некоторую функцию фильтра в программе, которую мы используем, где применяются некоторые предварительные условия: 1. Макс 2000 символов 2. «Выбрать * из АРТ, где» является данным

Когда я пытаюсь запустить следующий код:

SELECT DISTINCT
art.artkeyi 

FROM CMKAT.AEZ

       INNER JOIN CMKAT.PRO
               ON aez.aezprokeyi = pro.prokeyi
       INNER JOIN CMKAT.ART 
               ON aez.aezartkeyi = art.artkeyi




and pro.proetykeyi = 1 



        and

        not exists

(select * from CMKAT.PSZ where pro.prokeyi = PSZ.pszprokeyi)

;

Я получаю подборку ВСЕХ статей.

Код должен быть отформатирован для фильтра так:

artkeyi IN (SELECT art.artkeyi FROM CMKAT.AEZ  INNER JOIN CMKAT.PRO ON aez.aezprokeyi = pro.prokeyi INNER JOIN CMKAT.ART ON aez.aezartkeyi = art.artkeyi and pro.proetykeyi = 1 and not exists (select * from CMKAT.PSZ where pro.prokeyi = PSZ.pszprokeyi))

(я не уверен на 100% в части artkeyi IN)

Таблица АРТ:

ARTKEYI, ARTKTYKEYI, ARTKAVKEYI, ARTUNJKEYI, ARTATYKEYI, ARTKOPI, ARTBEZC, ARTINFC, ARTANRC, ARTBNRC, ARTVNRS

18592293    1              1         8486        24260605       InkJet-Papier       225912  225912  71

Стол AEZ

"AEZPROKEYI"    "AEZKAVKEYI"    "AEZARTKEYI"    "AEZUNJKEYI"    "AEZNUMS"   "AEZBPRC"   "AEZBPOC"   "AEZIMPC"   "AEZDLAD"
1813235                1        18592293        12207711        0   ""  ""  "StdImp:"   20.06.18 17:31:26,000000000

Стол PRO

"PROKEYI"   "PROKATKEYI"    "PROKAVKEYI"    "PROETYKEYI"    "PROUNJKEYI"    "PROBEZC"
1813235         1               1              1              12207711  "InkJet-Papier"

1 Ответ

0 голосов
/ 25 апреля 2019

Я хочу выбрать все ART.ARTKEYI (и ART.ARTBEZC, если это возможно), присутствующие в AEZ.AEZARTKEYI (имеющие соответствующий AEZPROKEYI), но только если AEZPROKEYI отсутствует в PSZ.PSZPROKEYI

Звучит так, как вы хотите exists и not exists:

select a.*
from art a
where exists (select 1
              from aez az
              where az.AEZARTKEYI = a.AEZPROKEYI
             ) and
      not exists (select 1
                  from psz p
                  where p.PSZPROKEYI = a.AEZPROKEYI
                 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...