![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сравнение двух таблиц в базе данных [D7, Paradox]
Lis'S © (2006-06-24 11:01:00)Господа, помогите! Горю! Есть 2 таблицы, в них пять полей (лиц. счёт, ФИО и год. рождения). Необходимо сравнить эти две таблицы на наличие в них неправильных данных. Т.е. если хотя бы один символ не будет совпадать, то нужно вывести эту запись в таблицу ошибок. Я сделал примитивный вариант, когда записи находятся, так сказать, друг напротив друга, но этот вариант не катит, так как данные могут быть в любом месте таблицы. Пробовал прописывать через while not Table1.Eof сравнивает только с первой записью.
ЮЮ (2006-06-26 03:50:00) [1]SELECT e.*, t.*
FROM
EtalonTable.*
FULL JOIN TestTable t ON
(e.ACCOUNT = t.ACCOUNT) AND (e.FIO = t.FIO) AND ...
WHERE
(e.ACCOUNT IS NULL) OR (t.ACCOUNT IS NULL)
SergP. (2006-06-24 19:35:00) [2]Как я понял нужно в одной таблице отыскать все записи, которые не присутствуют в другой (в эталоне).
Курдль (2006-06-24 14:17:00) [3]
> Для примера Фамилия:
> Эталон:
> 00012 Иванов Иван Иванович 1914
>
> Проверяемая таблица:
> 00012 Ивонов Иван Иванович 1914
>
> Т.е. в фамилии не совпадает одна буква, что тоже считается
> ошибкой.
А если реально есть клиент с фамилией Ив онов, то ошибка ведь будет в счете!
Вам "в консерватории надо что-то подправить" (с).
Так программы с БД не делаются.
При такой постановке вопроса должны быть хотя бы 2 таблицы: клиентов и счетов. В первой не должен повториться ни один клиент (вероятность ничтожна, что найдутся 2 полных тезки с одной датой рождения). А вторая должна быть связана с первой в соотв. с Вашей бизнес-логикой (один-к-одному, один-ко-многим).
В Вашем случае автоматизация бессмысленна, пока данные не будут приведены в поорядок. Так что открывайте Excel и ручками ищите ошибки.
Lis'S (2006-06-24 13:49:00) [4]Для примера Лицевой счёт:
Эталон:
00012 Иванов Иван Иванович 1914
Проверяемая таблица:
00012 Иванов Иван Иванович 1914
00015 Иванов Иван Иванович 1914
Т.е. лицевой счёт в проверяемой таблице у одного и того же человека открыт два раза - это считается ошибкой.
Для примера Фамилия:
Эталон:
00012 Иванов Иван Иванович 1914
Проверяемая таблица:
00012 Ивонов Иван Иванович 1914
Т.е. в фамилии не совпадает одна буква, что тоже считается ошибкой.
Курдль (2006-06-24 13:17:00) [5]Ладно, я сегодня добрый - приведу пример для первого варианта, когда ПК все-таки есть:
select * from TABLE1 T1, TABLE2 T2
where T1.ACCOUNT = T2.ACCOUNT
and (T1.FIO <> T2.FIO or T1.DATE <> T2.DATE)
Курдль (2006-06-24 13:01:00) [6]Первичный ключ-то в таблицах есть? Например лицевой счет
Он должен совпадать в обеих таблицах? Или у программы должно быть чисто ассоциативное мышление типа "если в первой таблице есть запись Иван Иваныч Пупкин", то во второй "Иван Иваныч П апкин" - это ошибка?
Во втором случае - надо подумать, а в первом - даже думать не надо!
Savek (2006-06-24 12:28:00) [7]var
qr1,qr2 : TADOQery;
....
//Загружаем проверяемую таблицу
qr1.SQL.Clear;
qr1.SQL.Add('...');
...
qr1.Open;
//в цикле проверяем наличие данных в эталоне
while not qr1.eof do begin
whith qr2 do begin
SQL.Clear;
SQL.Add('select * from Эталон where Field1=:F1 ....');
Parameters.ParamByName("F1').value:=qr1.FieldByName('Field1');
....
Open;
if IsEmpty then begin
// если запрос пустой значит такой записи в эталоне нет, здесь запись ошибки
end;
end;
qr2.Next;
end;
Lis'S (2006-06-24 12:08:00) [8]Эта программа для проверки достоверности данных. Существует база с правильными записями (таблица 1 ), она служит как бы эталоном. И, например, необходимо сравнить на достоверность данных таблицу 1 с таблицей 2, которую присылает на проверку некая организация. В таблице 2
данные могут быть ошибочными и эти ошибки необходимо найти и вывести. То есть эта программка проверки на несоответствии значений полей двух баз.
Курдль (2006-06-24 11:47:00) [9]Само по себе наличие 2-х разных таблиц с одинаковыми данными говорит о грубом нарушении принципов построения реляционных БД.