2016-12-22 3 views
0

Прежде всего позвольте мне сказать, что это повторение нескольких вопросов стека переполнения, что все есть ответы - но ни один из них не решить мою проблемуКак выбрать топ 1 в запросе Access - и на самом деле заставить его работать

например - эти два: Access join on first record и How to select top 10 in Access query?


Моя проблема должна быть простой - но - очевидные ответы не работают.

У меня есть две таблицы. Клиент и транзакции.

Я хочу вернуть список клиентов с последней датой продажи. Easy right .... Выберите столбцы для клиента, а затем для даты продажи введите подзапрос, который ограничивает возврат к 1 позиции.

SELECT 
[Client].[LastName] as C1, 
[Client].[FirstName] as C2, 
(SELECT TOP 1 Transactions.SaleDate FROM Transactions WHERE Transactions.ClientID=Client.ClientID ORDER BY Transactions.SaleDate Desc) as C3, 
[Client].[ClientID] as C4 
FROM [Client] 

НО доступ говорит мне, что подзапрос имеет эту проблему: «В большинстве одной записи может быть возвращено этим подзапрос.»

Ах ... но переполнение стека имеет ответ на «В этом подзапросе может быть возвращено не более одной записи». ошибка.

---> «В ваш подзапрос возвращается более одного результата». "Попробуйте фиксируя данные с помощью выберите верхнюю 1"

At most one record can be returned by this subquery. (Error 3354)

хорошо ... Отлично.

Есть ли что-то еще в SQL, которое может смутить его, что я полностью отсутствует?

+0

Вместо подзапроса, возможно, вы можете использовать «DMax» («SaleDate», «Transactions», «ClientID =» и ClientID) AS C3' –

+0

Добавьте, что в качестве ПРИСОЕДИНИТЕСЬ и попробуйте, доступ к SQL-синтаксическому анализу может быть разорен (был там), попробуйте это: – Alex

ответ

2

Добавим, что в качестве соединения и попробовать его, доступ к SQL синтаксического анализа может быть разорен (там), попробуйте следующее:

SELECT 
    c.[LastName] as C1, 
    c.[FirstName] as C2, 
    sd.maxsaledate as C3, 
    c.[ClientID] as C4 
FROM 
    [Client] c 
    left join (select clientid, max(SaleDate) maxsaledate from transactions group by clientid) sd on 
     c.ClientID = sd.ClientID 
+0

Это сработало. Однако мне пришлось добавить «как» между «max (SaleDate)» и «maxsaledate», поэтому вы можете отредактировать свой ответ для будущих поисковиков. –

0

На самом деле, если вы хотите топ 1 работать и FORCE только одна запись, затем добавьте порядок по уникальному столбцу.

Так что это сработает.

SELECT 
[Client].[LastName] as C1, 
[Client].[FirstName] as C2, 
(SELECT TOP 1 Transactions.SaleDate FROM Transactions WHERE 
Transactions.ClientID=Client.ClientID ORDER BY Transactions.SaleDate Desc, 
    ID) as C3, 
    [Client].[ClientID] as C4 
    FROM [Client] 

Таким образом, простое добавление столбца в OrderBy на колонке с уникальным идентификатором (AutoNumber), таким образом, всегда приводит только в одном ряду. И запрос, как вы, скорее всего, будет работать лучше, чем с помощью max().