Запросить таблицу, где комбинации полей не выходят? - PullRequest
0 голосов
/ 12 февраля 2020

Я прошу прощения за плохо сформулированный заголовок: (

У меня три таблицы.

  1. Таблица MARA: статьи и их описания.
  2. Таблица MAR C: Ассортимент статей на сайт.
  3. Таблица T001W: Сайты и их местоположение.

Я пытаюсь найти недостающие записи в MAR C, которые демонстрируют, что статья НЕ является Ассортимент на сайт. См. прикрепленную таблицу для элементарного примера.

Здесь есть 2 статьи (A & B) и 4 сайта (1, 2, 3 и 4). Я ищу запрос, который может искать MAR C на основе статей в MARA и сайтов в MAR C и сказать мне, что не существует. Правильные ответы в этом примере будут A-4, B-1 и B -4.

В качестве альтернативы я могу указать значения MARA и T001W в списке в запросе, чтобы избежать каких-либо объединений. MARA будет иметь ~ 1500 значений, а T001W будет 2000.

<style type="text/css">
  .tg {
    border-collapse: collapse;
    border-spacing: 0;
  }
  
  .tg td {
    font-family: Arial, sans-serif;
    font-size: 14px;
    padding: 10px 5px;
    border-style: solid;
    border-width: 1px;
    overflow: hidden;
    word-break: normal;
    border-color: black;
  }
  
  .tg th {
    font-family: Arial, sans-serif;
    font-size: 14px;
    font-weight: normal;
    padding: 10px 5px;
    border-style: solid;
    border-width: 1px;
    overflow: hidden;
    word-break: normal;
    border-color: black;
  }
  
  .tg .tg-amwm {
    font-weight: bold;
    text-align: center;
    vertical-align: top
  }
  
  .tg .tg-8m24 {
    background-color: #000000;
    text-align: left;
    vertical-align: top
  }
  
  .tg .tg-8zwo {
    font-style: italic;
    text-align: left;
    vertical-align: top
  }
  
  .tg .tg-0lax {
    text-align: left;
    vertical-align: top
  }
</style>
<table class="tg">
  <tr>
    <th class="tg-amwm" colspan="2">MARA</th>
    <th class="tg-8m24"></th>
    <th class="tg-amwm" colspan="2">MARC</th>
    <th class="tg-8m24"></th>
    <th class="tg-amwm" colspan="2">T001W</th>
  </tr>
  <tr>
    <td class="tg-8zwo">Article</td>
    <td class="tg-8zwo">Desc</td>
    <td class="tg-8m24"></td>
    <td class="tg-8zwo">Article</td>
    <td class="tg-8zwo">Site</td>
    <td class="tg-8m24"></td>
    <td class="tg-8zwo">Site</td>
    <td class="tg-8zwo">Continent</td>
  </tr>
  <tr>
    <td class="tg-0lax">A</td>
    <td class="tg-0lax">Spoon</td>
    <td class="tg-8m24"></td>
    <td class="tg-0lax">A</td>
    <td class="tg-0lax">1</td>
    <td class="tg-8m24"></td>
    <td class="tg-0lax">1</td>
    <td class="tg-0lax">NA</td>
  </tr>
  <tr>
    <td class="tg-0lax">B</td>
    <td class="tg-0lax">Fork</td>
    <td class="tg-8m24"></td>
    <td class="tg-0lax">A</td>
    <td class="tg-0lax">2</td>
    <td class="tg-8m24"></td>
    <td class="tg-0lax">2</td>
    <td class="tg-0lax">SA</td>
  </tr>
  <tr>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-8m24"></td>
    <td class="tg-0lax">A</td>
    <td class="tg-0lax">3</td>
    <td class="tg-8m24"></td>
    <td class="tg-0lax">3</td>
    <td class="tg-0lax">EU</td>
  </tr>
  <tr>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-8m24"></td>
    <td class="tg-0lax">B</td>
    <td class="tg-0lax">2</td>
    <td class="tg-8m24"></td>
    <td class="tg-0lax">4</td>
    <td class="tg-0lax">AS</td>
  </tr>
  <tr>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-8m24"></td>
    <td class="tg-0lax">B</td>
    <td class="tg-0lax">3</td>
    <td class="tg-8m24"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
  </tr>
</table>

Редактировать: Добавление текстовых таблиц и образцов данных.

Таблица MARA
Статья | Описание
А | Ложка
B | Вилка

Стол MAR C
Артикул | Сайт
A | 1
A | 2
A | 3
B | 2
B | 3

Стол T001W
Сайт | Des c.
1 | NA
2 | SA
3 | EU
4 | AS

1 Ответ

0 голосов
/ 12 февраля 2020

Если я правильно понимаю, вы можете использовать cross join, чтобы сгенерировать все комбинации сайтов и статей, а затем удалить те, которые существуют:

select s.site, a.article
from sites s cross join
     articles a left join
     marc m
     on m.article = a.article and
        m.site = s.site
where m.article is null;

Я переименовал таблицы, так что logi запроса c легче следовать.

...