#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
это самое простое значение для ввода и точное передает цель кода.