#sql #vba #ms-access #subquery #where-clause
#sql #vba #ms-access #подзапрос #where-предложение
Вопрос:
Я использую VBA и ADODB.Connection для извлечения данных из базы данных Access. Я хотел бы выбрать данные из базы данных, если запись в определенном столбце появляется впервые. Это лучше всего объясняется на примере итак, вот пример таблицы, которую я быстро создал в Excel, давайте представим, что таблица называется «DrinkTable»
Я хотел бы извлечь транзакции, которые произошли после 9/1/2020, с помощью нового имени (это был первый раз, когда это имя когда-либо покупало напиток, имя никогда не появляется в столбце имя до 9/1/2020).
Я могу написать инструкцию SQL, которая извлекает все записи после 9/1/2020, используя: "SELECT [Name], [Drink], [Cost], [Date] FROM [DrinkTable] WHERE [Date] >= #"9/1/2020#" ORDER BY [ID] DESC;
но это не дает того, что я пытаюсь. Правильный вывод, который я ищу, это:
Может ли кто-нибудь помочь мне уточнить мой оператор SQL, чтобы извлекать данные только в том случае, если запись в столбце [Имя] не появлялась до «9/1/2020?»
Комментарии:
1. Ах, хороший улов! Извините, я сделал это быстро и пропустил его добавление — обновил сообщение сейчас
Ответ №1:
Вы можете использовать not exists
для фильтрации строк, Name
появившихся до даты разделения:
SELECT [Name], [Drink], [Cost], [Date]
FROM [DrinkTable] d
WHERE
[Date] >= #"9/1/2020#"
AND NOT EXISTS (
SELECT 1
FROM [DrinkTable] d1
WERE d1.[Date] < #"9/1/2020#" AND d1.[Name] = d.[Name]
)
ORDER BY [ID] DESC
Комментарии:
1. Изо всех сил пытаюсь заставить это работать с ADOBD в VBA, но буду держать вас в курсе
Ответ №2:
Попробуйте
SELECT d1.[Name], [Drink], [Cost], [Date] FROM [DrinkTable] AS d1
LEFT JOIN (SELECT [Name] FROM [DrinkTable] WHERE [Date] < #9/1/2020# ) as d2
ON d1.name = d2.name
WHERE ISNULL(d2.name)
Комментарии:
1. Попробовав это, вы будете в курсе