#sql #excel #vba #ms-access #where-clause
#sql #excel #vba #ms-access #where-предложение
Вопрос:
У меня есть форма, в которую я привожу названия продуктов. Я исключаю те, которые находятся в другой таблице.
SELECT ID_Produto, NomeProduto
FROM tbl_produtos
where ID_Produto Not IN (Select ID_Produto from tbl_produtos_parceiros)
order by NomeProduto
Результаты соответствуют ожиданиям.
В той же форме у меня есть функция поиска. Я попробовал то же условие, NOT IN
:
SELECT *
FROM tbl_produtos
WHERE id_produto LIKE '%ALH%'
OR nomeproduto LIKE '%ALH%'
OR responsavel LIKE '%ALH%'
OR precovenda LIKE '%ALH%'
AND id_produto NOT IN (SELECT id_produto
FROM tbl_produtos_parceiros);
Все еще приносит продукт «Alho», который находится на tbl_produtos_parkeiros.
Ответ №1:
Вам нужны круглые скобки вокруг OR
условий редактирования:
SELECT *
FROM tbl_produtos
WHERE
(
id_produto LIKE '%ALH%'
OR nomeproduto LIKE '%ALH%'
OR responsavel LIKE '%ALH%'
OR precovenda LIKE '%ALH%'
)
AND id_produto NOT IN (SELECT id_produto FROM tbl_produtos_parceiros);
Зачем вам это нужно, потому OR
что имеет более низкий логический приоритет, чем AND
. Без круглых скобок ваш запрос эквивалентен:
SELECT *
FROM tbl_produtos
WHERE
id_produto LIKE '%ALH%'
OR nomeproduto LIKE '%ALH%'
OR responsavel LIKE '%ALH%'
OR (
precovenda LIKE '%ALH%'
AND id_produto NOT IN (SELECT id_produto FROM tbl_produtos_parceiros)
);
Комментарии:
1. Отлично! Спасибо!
Ответ №2:
Если это MS Access, вам нужно исправить подстановочные знаки и разделители строк, а также исправить синтаксис. Я бы также рекомендовал NOT EXISTS
:
SELECT p.*
FROM tbl_produtos as p
WHERE (id_produto LIKE "*ALH*" OR
nomeproduto LIKE "*ALH*" OR
responsavel LIKE "*ALH*" OR
precovenda LIKE "*ALH*"
) AND
NOT EXISTS (SELECT 1
FROM tbl_produtos_parceiros as pp
WHERE pp.id_produto = p.id_produto
);