Как использовать NOT IN с LIKE в функции поиска?

#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
                 );