Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2014, 03:32   #1
terexa
Пользователь
 
Регистрация: 05.12.2014
Сообщений: 11
По умолчанию Скопировать строки из таблицы в таблицу с неповторяющимися значениями нескольких полей

Необходимо скопировать строки из таблицы1 (HourData) в таблицу2 (HourData_2). При этом копировать только те строки, для которых одновременно выполняется условие: HourData.Data<>HourData_2.Data AND HourData.TimeMs<>HourData_2.TimeMs.
БД Access. Структура таблиц аналогичная: поля Data, TimeMs, TStreet, Tinside, DataEdit


Пытался несколькими способами, но выдает либо избыточное количество строк (почти декартово произведение), либо не все строки, отвечающие условию задачи
В случае одновременного равенства, т.е. когда оба поля совпадают, проблем нет:
Код:
Zapros:='SELECT HourData.Data,HourData.TimeMs,HourData.TemperatureInside,HourData.TemperatureStreet,HourData.DataFull 
  FROM HourData,HourData_2 WHERE HourData.Data=HourData_2.Data AND HourData.TimeMs=HourData_2.TimeMs;';
А вот при несовпадении не получается.
Код:
with MySQLQueryRez do
begin
        SQL.Clear;
        //вставить строку по ключу дата+время
        Zapros:='INSERT INTO HourData_2 (Data,TimeMs,TemperatureInside,TemperatureStreet,DataFull) ';
        SQL.Add(Zapros);
        // вар1 копирутся одни и те же строки по несколько раз
        //      Zapros:='SELECT HourData.Data,HourData.TimeMs,HourData.TemperatureInside,HourData.TemperatureStreet,HourData.DataFull 
   FROM HourData,HourData_2 WHERE HourData.Data<>HourData_2.Data AND HourData.TimeMs<>HourData_2.TimeMs;';
        //вар2 копирует меньше значений, чем надо, и не учтено поле Data
        //       Zapros:='SELECT HourData.Data,HourData.TimeMs,HourData.TemperatureInside,HourData.TemperatureStreet,HourData.DataFull 
  FROM HourData WHERE HourData.TimeMs NOT IN (SELECT TimeMs FROM HourData_2);';
        SQL.Add(Zapros);
        ExecSQL;
end;

Последний раз редактировалось Stilet; 11.12.2014 в 07:44.
terexa вне форума Ответить с цитированием
Старый 11.12.2014, 07:55   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

where not exists(select 1 from таблица2 where таблица2.дата=таблица1.дата and таблица2.время=таблица1.время)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.12.2014, 09:24   #3
terexa
Пользователь
 
Регистрация: 05.12.2014
Сообщений: 11
По умолчанию Спасибо

Итоговый вариант:
with MySQLQueryRez do
begin
SQL.Clear;
//вставить строку по ключу дата+время
Zapros:='INSERT INTO HourData_2 (Data,TimeMs,TemperatureInside,Temp eratureStreet,DataFull) ';
SQL.Add(Zapros);
Zapros:='SELECT HourData.Data, HourData.TimeMs, HourData.TemperatureInside, HourData.TemperatureStreet, HourData.DataFull FROM HourData';
SQL.Add(Zapros);
Zapros:='WHERE not exists(select 1 from HourData_2 where HourData.Data=HourData_2.Data and HourData.TimeMs=HourData_2.TimeMs); ';
SQL.Add(Zapros);
ExecSQL;
end;
Единственно, не понял/не нашел,что значит 1 в SELECT 1 FROM Таблица
terexa вне форума Ответить с цитированием
Старый 11.12.2014, 09:51   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А что бы быстрей селект работал. 1 вычисляемое поле, выражение для вычисления которого из одной константы состоит
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на одномерный массив: скопировать таблицы А[1..3] и B[1..8] в таблицу С kirill957 Помощь студентам 4 19.05.2014 22:37
Access ограничить значение поля таблицы значениями полей другой таблицы Сергей089 Microsoft Office Access 10 08.12.2010 02:22
Как скопировать данные из таблицы, включающей пустые строки yursanch Microsoft Office Excel 5 22.09.2010 16:07
Объеденение полей запроса в для отображения нескольких полей в одном списке mrCreator Microsoft Office Access 3 08.08.2009 00:53
с помощью макроса скопировать значение всей строки(не одной ячейки, а нескольких) global Microsoft Office Excel 6 27.11.2008 17:43