Форум: "Базы";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];
ВнизСравнение двух таблиц в базе данных Найти похожие ветки
← →
Lis'S (2006-06-24 11:01) [0]Господа, помогите! Горю! Есть 2 таблицы, в них пять полей (лиц. счёт, ФИО и год. рождения). Необходимо сравнить эти две таблицы на наличие в них неправильных данных. Т.е. если хотя бы один символ не будет совпадать, то нужно вывести эту запись в таблицу ошибок. Я сделал примитивный вариант, когда записи находятся, так сказать, друг напротив друга, но этот вариант не катит, так как данные могут быть в любом месте таблицы. Пробовал прописывать через while not Table1.Eof сравнивает только с первой записью.
← →
Курдль © (2006-06-24 11:47) [1]Само по себе наличие 2-х разных таблиц с одинаковыми данными говорит о грубом нарушении принципов построения реляционных БД.
← →
Lis'S (2006-06-24 12:08) [2]Эта программа для проверки достоверности данных. Существует база с правильными записями (таблица 1 ), она служит как бы эталоном. И, например, необходимо сравнить на достоверность данных таблицу 1 с таблицей 2, которую присылает на проверку некая организация. В таблице 2
данные могут быть ошибочными и эти ошибки необходимо найти и вывести. То есть эта программка проверки на несоответствии значений полей двух баз.
← →
Savek (2006-06-24 12:28) [3]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;
← →
Курдль © (2006-06-24 13:01) [4]Первичный ключ-то в таблицах есть? Например лицевой счет
Он должен совпадать в обеих таблицах? Или у программы должно быть чисто ассоциативное мышление типа "если в первой таблице есть запись Иван Иваныч Пупкин", то во второй "Иван Иваныч Папкин" - это ошибка?
Во втором случае - надо подумать, а в первом - даже думать не надо!
← →
Курдль © (2006-06-24 13:17) [5]Ладно, я сегодня добрый - приведу пример для первого варианта, когда ПК все-таки есть:
select * from TABLE1 T1, TABLE2 T2
where T1.ACCOUNT = T2.ACCOUNT
and (T1.FIO <> T2.FIO or T1.DATE <> T2.DATE)
← →
Lis'S (2006-06-24 13:49) [6]Для примера Лицевой счёт:
Эталон:
00012 Иванов Иван Иванович 1914
Проверяемая таблица:
00012 Иванов Иван Иванович 1914
00015 Иванов Иван Иванович 1914
Т.е. лицевой счёт в проверяемой таблице у одного и того же человека открыт два раза - это считается ошибкой.
Для примера Фамилия:
Эталон:
00012 Иванов Иван Иванович 1914
Проверяемая таблица:
00012 Ивонов Иван Иванович 1914
Т.е. в фамилии не совпадает одна буква, что тоже считается ошибкой.
← →
Курдль © (2006-06-24 14:17) [7]
> Для примера Фамилия:
> Эталон:
> 00012 Иванов Иван Иванович 1914
>
> Проверяемая таблица:
> 00012 Ивонов Иван Иванович 1914
>
> Т.е. в фамилии не совпадает одна буква, что тоже считается
> ошибкой.
А если реально есть клиент с фамилией Ивонов, то ошибка ведь будет в счете!
Вам "в консерватории надо что-то подправить" (с).
Так программы с БД не делаются.
При такой постановке вопроса должны быть хотя бы 2 таблицы: клиентов и счетов. В первой не должен повториться ни один клиент (вероятность ничтожна, что найдутся 2 полных тезки с одной датой рождения). А вторая должна быть связана с первой в соотв. с Вашей бизнес-логикой (один-к-одному, один-ко-многим).
В Вашем случае автоматизация бессмысленна, пока данные не будут приведены в поорядок. Так что открывайте Excel и ручками ищите ошибки.
← →
SergP. (2006-06-24 19:35) [8]Как я понял нужно в одной таблице отыскать все записи, которые не присутствуют в другой (в эталоне).
← →
ЮЮ © (2006-06-26 03:50) [9]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)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.038 c