Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Здравствуйте.
Прошу помощи в составлении sql запроса для заполнения столбца.
Есть таблица CLIENTS (клиенты) и есть таблица ORDERS (заказы), связанные через поля ID и ClientID соотв. Каждая запись клиента связана с несколькими записями о его заказах. В таблице ORDERS есть помимо прочих поле OrderDate (дата заказа). В таблице CLIENTS создал поле LastOrderDate.
Вопрос: как с помощью sql я могу заполнить весь столбец датами последнего заказа для каждого клиента?
Неактивен
insert into CLIENTS (OrderDate) select ..
как написать правильный select см http://sqlinfo.ru/articles/info/18.html
Неактивен
большое спасибо за наводку,
а можно ли вместо INSERT использовать SET?
update CLIENTS set LastOrderDate = select ..
Неактивен
да, вы правы. insert здесь не нужен
см синтаксис для update нескольких таблиц
http://dev.mysql.com/doc/refman/5.5/en/update.html
Неактивен
здорово, про update нескольких таблиц не знал.
Спасибо, пошел изучать.
Неактивен
там есть примеры, но в вашем случае одной из таблиц будет подзапрос возвращающий дату последнего заказа для каждого клиента.
Неактивен
прошу прощения, но мытарства мои не прекратились, может подскажете?
1) создал селект из таблицы "ЗАКАЗЫ"
SELECT ClientID, max(OrderDate) as MaxDate FROM Orders GROUP BY ClientID
не нарадуюсь на него, получилась таблица из 2-х столбцов : ClientID, MaxDate. Напротив каждого клиента дата его последнего заказа. Отлично.
2) сделал объединение новой таблицы-селекта с таблицей CLIENTS
CLIENTS cl INNER JOIN (SELECT ClientID, max(OrderDate) AS MaxDate FROM Orders GROUP BY ClientID) s ON s.ClientID=cl.ID
и здесь победа. SELECT * показал именно то, что нужно
SELECT * FROM (CLIENTS cl INNER JOIN (SELECT ClientID, max(OrderDate) AS MaxDate FROM Orders GROUP BY ClientID) s ON s.ClientID=cl.ID)
а именно, остались записи лишь с клиентами, у которых есть хотя бы один заказ, и напротив каждого в поле MaxDate была дата его последнего заказа. Казалось бы, вот оно счастье, но
3) конструкция
UPDATE
(
SELECT * FROM
Clients cl INNER JOIN (SELECT ClientID, max(OrderDate) AS MaxDate FROM Orders GROUP BY ClientID) s ON s.ClientID=cl.ID
)
tt
SET tt.LastOrderDate=tt.MaxDate
не изменяет ничего, поле LastOrderDate таблицы Clients как было пустым, так и осталось в чем мой косяк?
Отредактированно Lavr (30.03.2014 16:25:32)
Неактивен
потому что вы меняете поле LastOrderDate таблицы tt, а не Clients
Неактивен
vasya написал:
потому что вы меняете поле LastOrderDate таблицы tt, а не Clients
UPDATE Clients , (SELECT ClientID, max(OrderDate) as MaxDate FROM Orders GROUP BY ClientID) tt SET Clients.LastOrderDate=tt.MaxDate WHERE Clients.ID=tt.ClientID;
вот я дурак спасибо!
правда у меня выявился необычный глюк, почему то не работает подзапрос SELECT
Неактивен
Оба запроса делают одно и тоже. Логично, что после выполнения первого вы не увидите изменений выполнив второй.
Замените во втором запросе null на какое-нибудь значение.
Неактивен
vasya написал:
Оба запроса делают одно и тоже.
спасибо. Значит я все делал правильно.
vasya написал:
Замените во втором запросе null на какое-нибудь значение.
делал, первым запросом обнулял =null, вторым ставил произвольную дату ='01.01.2001' и наоборот
первый способ работает, второй - нет
в общем проблема аппаратная, скорее связана с тем, что я делаю запрос в триггере при открытии БД
большое спасибо за консультации по SQL и оценку итогов!
Отредактированно Lavr (30.03.2014 21:11:13)
Неактивен
А можете привести полный текст триггера? Любопытно, такого поведения быть не должно.
Неактивен
vasya написал:
А можете привести полный текст триггера? Любопытно, такого поведения быть не должно.
эээ, ну это затруднительно.
Я новичок , и недавно начал пользоваться оболочкой "Учет клиентов".
Там есть опции - добавить триггер:
хотя знал бы, что будет "так просто" с этой "упрощенной" оболочкой, не заморачивался бы и сразу вел базу в MS Access по науке, медленно, зато надежно.
Отредактированно Lavr (30.03.2014 22:04:28)
Неактивен
так у вас база не MySQL?
тогда возможно это и нормальное поведение, там отличаются диалекты SQL
Неактивен
Большое спасибо вам, Vasya!
Без вас бы погряз в страхах и неуверенности.
Неактивен
Страниц: 1