2015-11-10 3 views
0

Я попытался найти ответ для этого в других потоках и не смог его найти. Пожалуйста, простите меня, если он покрыт другой нитью.Запрос доступа - обновление по последней дате

Я относительно новичок в T-SQL, поэтому, пожалуйста, извините, если это то, что я должен уже знать.

У меня есть простой Доступ к базе данных с двумя таблицами: контакты и заказы.

Столбцы контактов - это идентификатор (PK), FirstName, LastName, Address, поле Status (идентификация, если клиент является «ПК», что имеет значение в этом случае), а также имеет поле «Delayed». " Это поле должно быть «истинным» для тех клиентов, которые не заказывали последние два месяца (и «ложные» для тех, кто имеет).

В таблице заказов есть номера заказов, а также идентификатор клиента (PK, связанный с контактами), FirstName, LastName, Date.

Я пытаюсь написать запрос, чтобы обновить поле «Задержка» в таблице «Контакты» на основе последней даты заказа из таблицы «Заказы». В этом случае обновите это поле до «false» для каждого клиента ПК, если их последняя дата заказа будет за последние 60 дней. Это выглядело довольно странно, но я, очевидно, что-то пропустил. Я использую подзапрос SELECT для определения условий. Запрос, кажется, игнорирует мои условия и хочет обновить ВСЕ строки в базе данных. Есть предположения?

UPDATE Contacts SET Contacts.Delayed = False 
WHERE EXISTS (SELECT Contacts.FirstName, Contacts.LastName, Contacts.Status, Max(Orders.Date) 
FROM Contacts INNER JOIN Orders ON (Contacts.ID = Orders.ContactID) 
GROUP BY Contacts.FirstName, Contacts.LastName, Contacts.Status 
HAVING Max(Orders.Date) > Date()-60); 

Любая помощь была бы принята с благодарностью.

+1

* «Я относительно новым для T-SQL, поэтому, пожалуйста, простите, если это то, что я уже должен знать.» * - Первое, что вы должны знать, что Microsoft Access не использует «T-SQL» , он использует «Access SQL». T-SQL - это диалект, используемый Microsoft SQL Server. Они не одинаковы. –

+0

Да, я знаю, и я понимаю, что они не то же самое. Хотя я больше привык работать с T-SQL, Access SQL похож, но его нюансы немного расстраивают, чтобы привыкнуть. :) –

+0

Хорошо, хорошо. Теперь есть особая причина, по которой вопрос помечен как «sql-server»? –

ответ

0

Поскольку вы используете существующий, если запрос возвращает результат, все контакты будут иметь установленный атрибут задержки.

Что вы хотите сделать, это отфильтровать результаты, которые вы собираетесь обновлять, используя соединение. Вам понадобится левое соединение, потому что вы хотите найти заказы, которые не состоялись в течение последних двух месяцев.

UPDATE tblContacts 
SET  Contacts.Delayed = False 
FROM Contacts tblContacts 
     LEFT JOIN (SELECT Contacts.FirstName , 
          Contacts.LastName , 
          Contacts.Status , 
          MAX(Orders.Date) 
        FROM Contacts 
          INNER JOIN Orders ON (Contacts.ID = Orders.ContactID) 
        GROUP BY Contacts.FirstName , 
          Contacts.LastName , 
          Contacts.Status 
        HAVING MAX(Orders.Date) > Date() - 60 
       ) tbl ON tbl.Contacts.Id = tblContacts.Id 
WHERE tblContacts.Id IS NULL 
+0

Спасибо за ответ, Джесси! Я определенно дам это выстрел. Еще раз, извините мое невежество. Не супер сильный в Access SQL. Откуда появляется «Contacts_Key»? –

+0

Ничего не беспокоит Ник! Вот почему этот сайт здесь. Если это сработает для вас, не забудьте отметить его как решение;) –

+0

Я думаю, что это, вероятно, будет работать, но доступ лает, потому что он хочет, чтобы все операторы JOIN были разделены круглыми скобками. Все еще пытаюсь понять, как отформатировать заявление, чтобы сделать Access счастливым ... :) –

Смежные вопросы