Задать вопрос
@Pavel_Zh
Программист-любитель

Как правильно написать запрос в SQL с NOT IN, NOT EXISTS или как-то иначе?

Добрый день!
Для упрощения вопроса спрошу на примере. Есть база видеоархива: 4 таблицы.
Видеозапись (T_video) находиться на носителе (T_nositel): это кассета или файл (T_type).
Кассет целый зоопарк, для примера всего две.
Нужно вывести все все записи не оцифрованные.
Я пробовал сделать запрос с NOT IN, но знаний моих явно не хватает; выводит всё подряд.
Пока работает с функцией в запросе. Но было бы здорово переписать всё это на sql.

Рабочий вариант: запрос выводит видеозаписи по условию, что в носителях не числится файл.
Запрос с функцией:
SELECT T_video.nameVideo, T_nositel.nameNositel, T_type.nameType
FROM T_video INNER JOIN (T_type INNER JOIN (T_nositel INNER JOIN T_VN ON T_nositel.idNositel = T_VN.idN) ON T_type.idType = T_nositel.typeNositel) ON T_video.idVideo = T_VN.idV
WHERE (((True)=verifyType([idVideo])));


Функция получает id видеозаписи, получает список носителей и если среди них нет id файла (3) выдаёт true.
Текст самой функции. Язык VBA:
Public Function verifyType(ByVal idVideo As Long) As Boolean
Dim qdf As DAO.QueryDef, rs As DAO.Recordset
Set qdf = CurrentDb.QueryDefs("Z_verify")
qdf.Parameters("id").Value = idVideo
With qdf.OpenRecordset(dbOpenSnapshot)
    .FindFirst "[typeNositel]=3"
    verifyType = .NoMatch
End With
End Function


запрос Z_verify:
SELECT T_nositel.typeNositel
FROM T_video INNER JOIN (T_nositel INNER JOIN T_VN ON T_nositel.idNositel = T_VN.idN) ON T_video.idVideo = T_VN.idV
WHERE (((T_video.idVideo)=[id]));


Помогите с запросом.
База:
68b017bac7d21052629033.png
Запрос: вывести всё
68b0180418393898936008.png
Искомый вывод, который нужно получить sql запросом: показать записи только на кассетах
68b01dd4eb8d8063148386.png
  • Вопрос задан
  • 42 просмотра
Подписаться 1 Средний 9 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы