Проверьте, есть ли у элемента данные

#sql #sql-server #count #subquery #having-clause

#sql #sql-сервер #подсчитайте #подзапрос #having-предложение

Вопрос:

У меня есть таблица, которая содержит множество полей.

Что я пытаюсь сделать, так это посмотреть, отсутствуют ли в каких-либо элементах определенные поля.

Пример данных:

  -------- ---------- ------- 
| ITEMNO | OPTFIELD | VALUE |
 -------- ---------- ------- 
| 0      | x        | 1     |
 -------- ---------- ------- 
| 0      | x        | 1     |
 -------- ---------- ------- 
| 0      | x        | 1     |
 -------- ---------- ------- 
| 0      | x        | 1     |
 -------- ---------- ------- 
| 0      | x        | 1     |
 -------- ---------- ------- 
  

Есть 4 «OPTFIELD», которые я хочу посмотреть, есть ли у всех «ITEMNO».

Итак, логика, которую я хочу применить, примерно такая:

Показать все элементы, у которых нет «OPTFIELD» — «LABEL», «PG4», «PLINE», «BRAND»

Возможно ли это вообще?

Ответ №1:

Ваши данные не имеют смысла. Из описания вашего вопроса похоже, что вы хотите, чтобы у itemno них были не все 4 optfield s. Для этого один метод использует агрегацию:

 select itemno
from mytable
where optfield in ('LABEL', 'PG4', 'PLINE', 'BRAND')
group by itemno
having count(*) < 4
  

С другой стороны, если вы хотите отобразить все отсутствующие (itemno, optfield) кортежи, то вы можете перекрестно объединить список itemno s с производной таблицей с помощью optfield s, затем используйте not exists :

 select i.itemno, o.optfield
from (select distinct itemno from mytable) i
cross join (values ('LABEL'), ('PG4'), ('PLINE'), ('BRAND')) o(optfield)
where not exists (
    select 1 
    from mytable t
    where t.itemno = i.itemno and t.optfield = o.optfield
)
  

Комментарии:

1. Привет, GMB, спасибо за ваш ответ. В таблице есть другое «OPTFIELD», но те, которые я ищу, чтобы увидеть, есть ли у них, — это «LABEL», «PG4», «PLINE», «BRAND». Теоретически эти поля сами по себе являются необязательными файлами в нашей ERP-системе и их «не обязательно» добавлять к элементу, но в моем сценарии они мне нужны, и я не могу найти способ проверить, нет ли их там, если это имеет смысл?