Исключить значение, если они имеют один и тот же идентификатор

#sql #ms-access

#sql #ms-access

Вопрос:

У меня есть это утверждение в моей базе данных Access: в нем указан Magazzino.Codice из 2 таблиц и соответствующих количеств.

 SELECT Magazzino.Codice, Magazzino.Qnt
FROM Magazzino
WHERE (((Magazzino.[Prossimo_arrivo]) Is Null) And ((Magazzino.Qnt)<30) And ((Magazzino.[Fascia_I])=True));
UNION ALL --Joins allowing duplicates
SELECT Magazzino.Codice, Magazzino.Qnt 
FROM  Magazzino
WHERE (((Magazzino.[Prossimo_arrivo]) Is Null) And ((Magazzino.Qnt)<10) And ((Magazzino.[Fascia_II])=True));
 

Я хочу добавить оператор, избегающий перечисления Magazzino.Codice, если тот же идентификатор присутствует в третьей таблице Magazzino Grezzi.
Как я могу это получить?

Ответ №1:

Во-первых, упростите логику, предполагая, что вы не хотите, чтобы дубликаты образовывали эту таблицу:

 SELECT m.Codice, m.Qnt
FROM Magazzino as m
WHERE m.[Prossimo_arrivo]) Is Null AND
      ( (m.Qnt < 30 AND m.[Fascia_I] = True) OR
        (m.Qnt < 10 AND m.[Fascia_II] = False) OR
      )
 

Затем используйте IN или EXISTS :

 SELECT m.Codice, m.Qnt
FROM Magazzino as m
WHERE m.[Prossimo_arrivo]) Is Null AND
      ( (m.Qnt < 30 AND m.[Fascia_I] = True) OR
        (m.Qnt < 10 AND m.[Fascia_II] = False) OR
      ) AND
      NOT EXISTS (SELECT 1
                  FROM Magazzino_Grezzi as mg
                  WHERE mg.Codice = m.Codice
                 );
 

Если вы действительно хотите, чтобы некоторые строки дублировались (те, которые удовлетворяют обоим условиям), то вы можете добавить это NOT EXISTS предложение в оба ваших подзапроса.

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

1. «ВЫБРАТЬ 1»? почему «1»?

2. @Andrea . . . EXISTS проверяет наличие существующих строк. В общем, строки должны иметь столбец. Я считаю, что 1 это самое простое значение для ввода и точное передает цель кода.