#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-системе и их «не обязательно» добавлять к элементу, но в моем сценарии они мне нужны, и я не могу найти способ проверить, нет ли их там, если это имеет смысл?